Linux —— 重定向与管道
系统的输入输出包括:
默认输入设备:标准输入,STDIN,描述符为0
默认输出设备:标准输出,STDOUT,描述符为1
标准错误输出,STDERR,描述符为2
标准输入,标准输出,标准错误输出是三个不同的数据流
系统默认标准输入是从键盘读取,标准输出和标准错误输出是输出到显示器
Linux中I/O重定向:
输出重定向,
>:覆盖输出,作为输出目标的文件原有内容会被覆盖
示例:
root@ubuntu:/home/linlin/linlin/test# echo 'The dog is so cute'
The dog is so cute
root@ubuntu:/home/linlin/linlin/test# echo 'The dog is so cute' > file
root@ubuntu:/home/linlin/linlin/test# cat file
The dog is so cute
覆盖
root@ubuntu:/home/linlin/linlin/test# echo 'The cat is so smart' > file
root@ubuntu:/home/linlin/linlin/test# cat file
The cat is so smart
>>:追加输出,保留作为输出目标的原有文件
示例:
root@ubuntu:/home/linlin/linlin/test# echo 'The dog is so cute' >> file
root@ubuntu:/home/linlin/linlin/test# cat file
The cat is so smart
The dog is so cute
在使用输出重定向时,可能由于某个输出目标文件内容很重要,这时就需要使用追加
输出,但在实际使用过程中,很容易错把>当做>>使用,为了防止这个错误,我们可以
使用set命令
set:shell内置功能开关
set -C:禁止对已存在文件使用覆盖重定向
强制覆盖输出使用 >|
set +C:允许对已存在内容重定向
root@ubuntu:/home/linlin/linlin/test# set -C
root@ubuntu:/home/linlin/linlin/test# echo 'The cat is so smart' > file
bash: file: cannot overwrite existing file
tee:从标准输入读取数据,输出到标准输出,并保存至文件
2>:标准错误输出重定向
2>>:标准错误追加重定向
&>:重定向标准输出和标准错误输出到同一个文件
注意 &>> 不支持
<:输入重定向
<<结束符:表示在此处生成文档,当输入为结束符时表示输入结束
here document具体解释https://linux.die.net/abs-guide/here-docs.html
管道:把一个命令的输出作为另一个命令的输入
体现了Linux的基本思想之一:组合小命令完成复杂任务
使用格式:
命令1 | 命令2 | ......
例如,取出某文件的倒数第3行
root@ubuntu:/home/linlin/linlin/test# cat file
10086
213
3134
21343452
2341
root@ubuntu:/home/linlin/linlin/test# tail -3 file | head -1
3134
构造管道时,应该试着让每个阶段的数据量变得更少,换句话说,如果你有两个要完成的步骤与先后次序无关,你可以
把让数据变少的那一个步骤放在管道的前面,这么做可以提高脚本的整体性能,应为此时系统只需要在两个程序中移动
少的数据量,每个程序要做的是也比较少。