当linux执行一个程序的时候,会自动打开三个流,标准输入*(standard input),标准输出(standard output),标准错误输出(standard error)*,比如在打开命令行时,默认情况下,命令行的标准输入连接到键盘,标准输出和标准错误都连接到屏幕,尽管三个流都打开,但他会根据需要使用。
重定向
>
>
可以改变文本流的方向,指定输出目的地。(覆盖)
例子:
输入命令
ls > aa.txt
解释:
改变ls命令用来显示内容的容器,默认容器是屏幕,现将容器改为aa.txt
执行结果:
打开aa.txt可看到所有ls命令的显示内容
「注意」:
- 若aa.txt是一个不存在文件,重定向时计算机会新建一个aa.txt文件,并将命令行的标准输出指向这个文件。
- 若aa.txt是一个已存在文件,重定向时会覆盖原aa.txt文件中的内容。
-
echo ok > a.txt
解释:echo的作用是将文本流导向标准输出
执行结果:ok写入a.txt中
-
cat < a.txt
解释:将cat标准输入只想a.txt,文本会从文件流到cat,然后输出到屏幕上
执行结果:同cat a.txt
-
cat < a.txt > b.txt
解释:a.txt中内容复制到了b.txt中
-
cat > a.txt < b.txt
解释:b.txt中内容复制到了a.txt中
>&
&
表示等同于的意思例子:
假设void是一个不存在的目录,当我们执行
cd void > a.txt
屏幕出现错误提示
bash: cd: void: No such file or directory
当我们执行
cd void >& a.txt
错误信息被导向a.txt
【shell|重定向> >>与标准输入、标准输出、标准错误输出】样例:
cd void 2 > a.txt > b.txt
解释:标准错误对应的总是2,所有有以上写法。标准错误输出到a.txt,标准输出输出到b.txt
追加
>>
>>
可以改变文本流的方向,指定输出目的地。(追加)例子:
cat a.txt >> b.txt
将cat a.txt命令的标准输出指向b.txt文件
执行结果:
打开b.txt可看到a.txt的内容被添加到原b.txt内容后面
「注意」:
- 若b.txt是一个不存在文件,重定向时计算机会新建一个b.txt文件,并将命令行的标准输出指向这个文件。
- 若b.txt文件已存在,重定向时会追加到原b.txt中内容后面,不覆盖。
- 做输入分隔符
分隔符可以是任意字符。
cat > a.txt << end
? 当执行cat > a.txt << end,命令并没有结束,cat命令在等待你给他输入数据,当我们敲入end后,cat命令才结束。end之前输入的字符都被写到a.txt文件中,这就是输入分隔符的作用。
高级用法
-
>/dev/null
这条命令的作用是将标准输出1重定向到/dev/null
中。/dev/null
代表linux的空设备文件,所有王这个文件里写入的内容都会丢失,俗称“黑洞”。执行此命令后,标准输出就会不再存在,没有任何地方能找到输出的内容。
-
2>&1
这条命令用到了重定向绑定,采用&可以将两个输出绑定在一起。这条命令的作用是错误输出将和标准输出同用一个文件描述符,也就是错误输出会和标准输出输出到同一个地方。
-
>/dev/null 2>&1 VS 2>&1 >/dev/null
从左到右地来分析2>&1 >/dev/null
:
2>&1
,将错误输出绑定到标准输出上。由于此时的标准输出是默认值,也就是输出到屏幕,所以错误输出会输出到屏幕。
>/dev/null
,将标准输出1重定向到/dev/null
中。
我们用一个表格来更好地说明这两条命令的区别:
命令 标准输出 错误输出 >/dev/null 2>&1 丢弃 丢弃 2>&1 > /dev/null 丢弃 屏幕
推荐阅读
- Linux|109 个实用 shell 脚本
- linux笔记|linux 常用命令汇总(面向面试)
- Linux|Linux--网络基础
- linux|apt update和apt upgrade命令 - 有什么区别()
- linux|2022年云原生趋势
- Go|Docker后端部署详解(Go+Nginx)
- 开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
- GitHub|7 款可替代 top 命令的工具