一、重定向
在看sh文件的时候,会发现明明echo或这报错了却没有显示出来,这是因为它们将输出存入别的地方了。
Linux shell中,执行程序时,它使用三个标准I/O流,每个流都由一个数字文件描述符表示:
0 - stdin,标准输入流。
1 - stdout,标准输出流。
2 - stderr,标准错误流。
基本上你可以:
1>.重定向stdout到一个文件
ls-l
#显示当前目录下所有文件的具体消息,并打印到屏幕上
ls-l >/home/ls-l.txt
#将ls-l的stdout重定向至文件,stdout将不会出现在终端
command > file
command 1> file
将命令的stdout重定向至文件,stdout将不会出现在终端。
如果文件已经存在,将会覆盖
ls -a | tee 1.txt
#在终端也能看到,也能保存到文件里面
command | tee output.txt
将命令的stdout复制至文件,此时终端依然能看到stdout
如果文件已经存在,将会覆盖
tee是linux的一个命令
command | tee -a output.txt
将命令的stdout复制至文件,此时终端依然能看到stdout。
如果文件已经存在,新数据将会添加至文件末尾
2>.重定向stderr到一个文件
ls-l
#因为ls和-l之间没有空格所以会报错
ls-l 2>/home/learn_shell/wrong_ls-l.txt
command 2> output.txt
如果没加2会被认为是将stdout重定向,依然会报错
将命令的stderr重定向至文件,stderr将不会出现在终端。
如果文件已经存在,将会覆盖。
command 2>> output.txt
将命令的stderr重定向至文件,stderr将不会出现在终端。
如果文件已经存在,新数据将会添加至文件末尾
要禁止在屏幕上显示错误消息,也不想把文件存到具体文件:将stderr重定向到/dev/null:
/dev/null 有点像垃圾堆,无底洞往里面丢就是咯
command 2> /dev/null
3>.重定向stdeer到stdout
ls-a &> 1.txt
command &> output.txt
command >output.txt 2>&1
将命令的stdout与stderr都重定向至文件,此时终端将没有任何输出。
如果文件已经存在,将会覆盖。
command &>> output.txt
将命令的stdout与stderr都重定向至文件,此时终端将没有任何输出。
如果文件已经存在,新数据将会添加至文件末尾。
command |& tee output.txt
将命令的stdout与stderr都复制至文件,此时终端依然能看到stdout与stderr
如果文件已经存在,将会覆盖
command |& tee -a output.txt
将命令的stdout与stderr都复制至文件,此时终端依然能看到stdout与stderr
如果文件已经存在,新数据将会添加至文件末尾
二、管道
将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)
command1 | command2 | command3 | ...
这里需要注意,command1 必须有正确输出,而 command2 必须可以处理 command2 的输出结果;而且 command2 只能处理 command1 的正确输出结果,不能处理 command1 的错误信息
例如之前重定向中有用到的 :
command | tee file.txt
这里就是用了管道的思想,
tee
可以将命令结果 通过管道 输出到 多个文件中