Linux 温习(九): IO 重定向与进程管道

简介: I/O输入/输出(Input/Output)的简称,I 即为输入,常见的输入设备有键盘和鼠标。O为输出,常见的打印机等。

I/O 重定向

基本知识介绍

什么是I/O

I/O输入/输出(Input/Output)的简称,I 即为输入,常见的输入设备有键盘和鼠标。O为输出,常见的打印机等。

什么是I/O重定向

学过HTML都知道,重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置,(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向),I/O重定向是把标准的输入与输出到其他文件或者其他终端

例如 1:终端0输入消息到终端1那么此过程叫做重定向(将终端0上的 ‘Redirect’ 重定向到终端 1

# 终端 0
> tty
/dev/pts/0
> echo 'Redirect' > /dev/pts/1
>
# 终端 1
[root@localhost ~]# tty
/dev/pts/1
[root@localhost ~]# Redirect

例如 2:将date输出的结果重定向到date.txt

> date > date.txt
> cat date.txt
Sun Apr  3 11:20:32 CST 2022

Linux 的标准输入与输出

在/proc虚拟机文件系统中,可以查看内核与进程的一些信息,其中有很多数字

> ls /proc/2191/fd -li
total 0
32321 lr-x------ 1 root root 64 Apr  3 10:13 0 -> /dev/null
32322 l-wx------ 1 root root 64 Apr  3 10:13 1 -> /dev/null
32323 l-wx------ 1 root root 64 Apr  3 10:13 2 -> /dev/null
32324 lrwx------ 1 root root 64 Apr  3 10:13 3 -> /dev/null

每一个进程在运行时都会打开一些文件,每一个文件都会有一个指定的数字标识,这个标识就交文字描述符。

上述的进程中有0、1、2、3的文件描述符,这也是绝大多数进程都有的。0 表示标准输入,可以理解为键盘输入;1 表示标准输出,输出到终端;2 表示标准错误,输出到终端;3 及以上为常规文件描述符;

1,2可理解为执行命令时输出的结果,包括失败和成功;这么说可能看不明白,演示几个例子就知道了

使用范例

范例 1:使用不存在的whomi命令,且将错误重定向到 error.txt 文件中 (错误不在输出)

> whomi
-bash: whomi: command not found
> whomi 2> error.txt
> cat error.txt 
-bash: whomi: command not found

范例 2:将date输出的内容重定向到date.txt

> date 1> date.txt
> cat date.txt
Sun Apr  3 12:20:32 CST 2022

有同学可能会有疑问 > 就直接输出了吗? 为什么还要 1> 其实系统是默认有1的,不加默认就是1;

输出重定向

输出重定向分为正确输出和错误输出

正确输出:1> 、1>> 等价于>、>>,1可省略

错误输出:2>、2>>

其中>表示覆盖,>>表示追加

使用范例

范例 1:输出重定向(覆盖)

> date 1> date.txt
> cat date.txt 
Sun Apr  3 14:45:34 CST 2022

范例 2:输出重定向(追加)

> date 1>> date.txt
> cat date.txt 
Sun Apr  3 14:45:34 CST 2022
Sun Apr  3 14:46:18 CST 2022

范例 3:错误输出到重定向

> ls /home/linux
ls: cannot access /home/linux: No such file or directory
> ls /home/linux 2>error.txt
> cat error.txt 
ls: cannot access /home/linux: No such file or directory

范例 4:正确结果与错误结果都输出到相同位置

> ll /home/ /home/linux &>list.txt
> cat list.txt 
ls: cannot access /home/linux: No such file or directory
/home/:
total 200
-rw-r--r--   1 root      root          58 Apr  3 14:46 date.txt
-rw-r--r--   1 root      root          57 Apr  3 14:48 error.txt
-rw-r--r--   1 root      root          57 Apr  3 14:49 list.txt

范例 5:正确结果保存到list.txt,错误结果丢到/dev/null

> ll /home/ /home/linux 1>list.txt 2>/dev/null

输入重定向

输入只有正确输入,且可以带结束符。(EOF、Ctrl+d)

恰好与输出相反:<、<<

使用范例

范例 1:使用grep命令过滤root,没有改变输入端,默认为键盘,接着把输入端重定向到/etc/passwd

> grep 'root'
linxu
root
root
> grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

范例 2:使用at命令创建一个计划,从现在开始 1 分钟后创建用户 linux ,按组合件Ctrl+d结束。

> at now +1 min
at> useradd linux
at> <EOF>

重定向案例

案例 1:利用重定向建立多行文件,并用EOF结束

> cat >file03.txt <<EOF
11
22 
33
EOF
> cat file03.txt
11
22
33

案例 2:多条命名输出重定向(两条以上命令需要加括号)

> ls;date &>/dev/null
date.txt  error.txt  file03.txt  list.txt  memcached  package.xml  redis  root  test.sh  zip-1.20.0  zip-1.20.0.tgz
> ls &>/dev/null ;date &>/dev/null
> (ls;date) &>/dev/null

Subshell

Subshell 是指圆括号里的命令会在另外的进程中执行。当需要让一组命令在不同目录下执行时,采用这种方法可以不修改主脚本的目录

请仔细看当前目录,一直处于home目录中,不加括号则返回到了root目录下。

> ls /root/
anaconda-ks.cfg  install.sh  package.xml
> (cd /root/; ls)
anaconda-ks.cfg  install.sh  package.xml
> 
> cd /root/; ls
anaconda-ks.cfg  install.sh  package.xml
[root@localhost ~]#

如果不希望某些命令执行对当前Shell环境产生影响,请在Subshell中执行(加括号)。

进程管道

管道实际上头也是一种重定向,重定向字符控制输出到文件,管道控制输出到其他程序,其实是将结果传递给下一个程序调用。管道符为“|”

管道中有一种特殊的管道,tee 管道,如果我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee管道,tee管道类似于生活中的三通水管。tee的作用是将一份标准输入多重定向,一份重定向到标准输出/dev/stdout,然后还将标准输入重定向到每个文件FILE中。

在使用管道时,前一个命令的标准错误不会被 tee 读取

使用范例

范例 1ps 命令结果通过管道给 grep 匹配

> ps -ef |grep php
root       1451      1  0 10:13 ?        00:00:00 php-fpm: master process (/www/server/php/74/etc/php-fpm.conf)
www        1481   1451  0 10:13 ?        00:00:00 php-fpm: pool www
www        1482   1451  0 10:13 ?        00:00:00 php-fpm: pool www
www        1485   1451  0 10:13 ?        00:00:00 php-fpm: pool www
www        1490   1451  0 10:13 ?        00:00:00 php-fpm: pool www
www        1495   1451  0 10:13 ?        00:00:00 php-fpm: pool www
root      22436   3257  0 15:32 pts/0    00:00:00 grep --color=auto php

范例 2:查看系统是否有linux用户

> cat /etc/passwd |grep linux
>

范例 3:使用free命令显示系统内存使用信息,并使用tee命令将信息输出到屏幕,并保存到文件mem.txt

> free -h | tee mem.txt
              total        used        free      shared  buff/cache   available
Mem:           1.8G        1.3G         99M         26M        375M        289M
Swap:          2.0G          0B        2.0G

范例 4:使用 tee 捕获错误(无法捕获)

> ls /home/linux >list.txt  2>&1 
> ls /home/linux  2>&1 | tee list.txt 
ls: cannot access /home/linux: No such file or directory

范例 5:查看系统是否有root用户,将结果打印在屏幕和保存到文件中

> cat /etc/passwd |grep root | tee a.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
> cat a.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
目录
相关文章
|
8月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
305 67
|
7月前
|
监控 Linux
Linux命令大全:echo与tail实现输出重定向。
这样,我们实现了使用echo和tail命令进行输出重定向的目的。在实际应用中,输出重定向技巧可节省时间,提高工作效率。希望本文内容对您了解和掌握Linux系统中echo与tail命令以及输出重定向的操作有所帮助。
242 27
|
7月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
224 16
|
7月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
144 20
|
6月前
|
Linux C语言 网络架构
Linux的基础IO内容补充-FILE
而当我们将运行结果重定向到log.txt文件时,数据的刷新策略就变为了全缓冲,此时我们使用printf和fwrite函数打印的数据都打印到了C语言自带的缓冲区当中,之后当我们使用fork函数创建子进程时,由于进程间具有独立性,而之后当父进程或是子进程对要刷新缓冲区内容时,本质就是对父子进程共享的数据进行了修改,此时就需要对数据进行写时拷贝,至此缓冲区当中的数据就变成了两份,一份父进程的,一份子进程的,所以重定向到log.txt文件当中printf和fwrite函数打印的数据就有两份。此时我们就可以知道,
111 0
|
6月前
|
存储 Linux Shell
Linux的基础IO
那么,这里我们温习一下操作系统的概念我们在Linux平台下运行C代码时,C库函数就是对Linux系统调用接口进行的封装,在Windows平台下运行C代码时,C库函数就是对Windows系统调用接口进行的封装,这样做使得语言有了跨平台性,也方便进行二次开发。这就是因为在根本上操作系统确实像银行一样,并不完全信任用户程序,因为直接开放底层资源(如内存、磁盘、硬件访问权限)给用户程序会带来巨大的风险。所以就向银行一样他的服务是由工作人员隔着一层玻璃,然后对顾客进行服务的。
97 0
|
6月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
131 0
|
6月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
203 0
|
6月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
133 0
|
6月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
185 0