Linux中>,>>,>&,&>,&,&&,|,||,2>&1到底是什么?
前言
在linux中我们时常能见到>,>>,>&,&>,&,&&,|,||,2>&1等符号,它们到底是什么?下面浅谈一下我的看法,如有不对的地方请大家及时指正!
linux中的文件描述符和重定向
文件描述符
在介绍上述符号表示什么之前,我们需要先知道在linux中有三种标准的文件描述符(也支持自定义),分别为:
- • 0:表示标准输入(stdin)
- • 1:表示标准输出(stdout)
- • 2:表示标准错误(stderr)
举个简单的例子,当我们ls
一个不存在的文件时,会报错如下:
[zhxia@aemol ~]$ ls donot_exist.txt
ls: cannot access donot_exist.txt: No such file or directory
其中ls: cannot access donot_exist.txt:
No such file or directory
就是标准错误。
重定向
再来简单理解一下重定向的含义。比如我写了个test.py脚本。
[zhxia@aemol ~]$ cat test.py
print('Hello World')
可以看到脚本中只有一行代码。现在我在linux上用python test.py
运行脚本,它本来是要输出Hello World
到屏幕的,但现在我不让它直接输出到屏幕上,而是存在了output.log日志文件中,这就叫将标准输出重定向到output.log文件中。
那要实现这个目的,我们可以这样写:
[zhxia@aemol ~]$ python test.py >output.log
查看output.log文件可以发现已经将Hello World
写入了:
[zhxia@aemol ~]$ cat output.log
Hello World
>和>>
>
用于将标准输出重定向至文件。如上面的例子,将Hello World
写入了output.log日志文件中而不是显示在屏幕上。
[zhxia@aemol ~]$ python test.py >output.log
[zhxia@aemol ~]$ cat output.log
Hello World
>>
>>
和>
的区别在于>
是覆写文件而>>
是追加文件。即对于>
,当文件存在时会先删除原文件,再重新创建文件,然后把内容写入该文件;否则直接创建文件。而对于>>
,当文件存在时直接在文件末尾进行内容追加,不会删除原文件;否则直接创建文件。举个简单的例子如下:
[zhxia@aemol ~]$ python test.py >output.log
[zhxia@aemol ~]$ cat output.log
Hello World
zhxia@aemol ~]$ python test.py >>output.log
[zhxia@aemol ~]$ cat output.log
Hello World
Hello World
>&和&>
>&
和&>
在很多情况下是可以互换的,它们与>
的区别在于:>
只能将标准输出重定向(对于标准错误依然会显示在屏幕上),而>&
和&>
可以将标准输出或标准错误都重定向输出。
举例如下:
[zhxia@aemol ~]$ ls donot_exist.txt
ls: cannot access donot_exist.txt: No such file or directory
[zhxia@aemol ~]$ ls donot_exist.txt >output.log
ls: cannot access donot_exist.txt: No such file or directory
[zhxia@aemol ~]$ cat output.log
[zhxia@aemol ~]$ ls donot_exist.txt >&output.log
[zhxia@aemol ~]$ cat output.log
ls: cannot access donot_exist.txt: No such file or directory
[zhxia@aemol ~]$ ls donot_exist.txt &>output.log
[zhxia@aemol ~]$ cat output.log
ls: cannot access donot_exist.txt: No such file or directory
>&
>&
后面既可以识别文件,可以识别文件描述符。
- • 当
>&
后面接文件时,表示将标准输出和标准错误输出重定向至文件。
[zhxia@aemol ~]$ ls donot_exist.txt >&output.log
[zhxia@aemol ~]$ cat output.log
ls: cannot access donot_exist.txt: No such file or directory
- • 当
>&
后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符。例如,将标准错误文件描述符2重定向至标准输出文件描述符1:
[zhxia@aemol ~]$ ls donot_exist.txt >output.log
ls: cannot access donot_exist.txt: No such file or directory
[zhxia@aemol ~]$ cat output.log
[zhxia@aemol ~]$ ls donot_exist.txt >output.log 2>&1
[zhxia@aemol ~]$ cat output.log
ls: cannot access donot_exist.txt: No such file or directory
&>
&>
后面只可以识别文件。
- • 当
&>
后面接文件时,可与>&
互相替换,都表示将标准输出和标准错误输出重定向至文件。
[zhxia@aemol ~]$ ls donot_exist.txt &>output.log
[zhxia@aemol ~]$ cat output.log
ls: cannot access donot_exist.txt: No such file or directory
- • 当
&>
后面接文件描述符时,表示将标准输出和标准错误输出重定向至与文件描述符同名的文件。
[zhxia@aemol ~]$ ls donot_exist.txt >output.log
ls: cannot access donot_exist.txt: No such file or directory
[zhxia@aemol ~]$ cat output.log
[zhxia@aemol ~]$ ls donot_exist.txt >output.log 2&>1
[zhxia@aemol ~]$ cat output.log
[zhxia@aemol ~]$ cat 1
ls: cannot access donot_exist.txt: No such file or directory
ls: cannot access 2: No such file or directory
[zhxia@aemol ~]$ ls donot_exist.txt 2 &>1
[zhxia@aemol ~]$ cat 1
ls: cannot access donot_exist.txt: No such file or directory
ls: cannot access 2: No such file or directory
从上面的例子中可以看到ls donot_exist.txt >output.log 2&>1
与ls donot_exist.txt 2 &>1
等价。
&和&&
&
&
表示将任务提交到后台运行。可以通过jobs
命令查看任务状态。
[zhxia@aemol ~]$python test.py &>output.log &
[1] 220546
[zhxia@aemol ~]$ jobs
[1]+ Done python test.py &>output.log
&&
&&
表示表示前一条命令执行成功后,才执行后一条命令。
[zhxia@aemol ~]$python test.py && echo 'Wow!'
Hello World
Wow!
[zhxia@aemol ~]$ ls donot_exist.txt && echo 'Wow!'
ls: cannot access donot_exist.txt: No such file or directory
|和||
|
|
表示管道,即将上一条命令的输出,作为下一条命令的输入参数。
[zhxia@aemol ~]$ ls
output.log test.py
[zhxia@aemol ~]$ ls | grep test.py
test.py
||
||
表示表示前一条命令执行失败后,才执行后一条命令。
[zhxia@aemol ~]$ ls
output.log test.py
[zhxia@aemol ~]$ ls donot_exist.txt || echo 'Wow!'
ls: cannot access donot_exist.txt: No such file or directory
Wow!
2&>1
2&>1
表示将标准错误输出重定向至标准输出。例如,先通过2&>1
将标准错误2输出重定向至标准输出1,再通过>
将标准输出1重定向到为output.log中,使得output.log中也包含了标准错误信息。不然仅有>output.log
的话,我们无法将标准错误存入output.log中。
[zhxia@aemol ~]$ ls donot_exist.txt >output.log
ls: cannot access donot_exist.txt: No such file or directory
[zhxia@aemol ~]$ cat output.log
[zhxia@aemol ~]$ ls donot_exist.txt >output.log 2>&1
[zhxia@aemol ~]$ cat output.log
ls: cannot access donot_exist.txt: No such file or directory
相关文章
- linux内核版本指什么意思,Linux的内核版本是怎么回事「建议收藏」
- Linux:百兆vs千兆—哪个更好?(linux百兆还是千兆)
- Linux最佳版本选择:全面考量一把手可以拥有最佳体验(linux系统什么版本好)
- 不可错过的Linux:让你体验最好的事物(linux系统适合做什么)
- 优化Linux系统内存参数优化指南(linux内存参数)
- 永恒之蓝:Linux系统的病毒攻击(永恒之蓝病毒linux)
- Linux查看内存使用情况的步骤(linux查看内存空间)
- Linux命令行必备:学习Linux基础操作(linux是什么命令)
- Linux桌面路径:探索桌面之路(linux桌面路径是什么)
- 编辑器Linux推出新版VI编辑器:突破性升级看这里!(linux推出vi)
- 【Linux运维:探索未知前沿】(linux运维学什么)
- 什么Linux系统的分区类型探秘(linux的分区类型是)
- Linux快速读取文件行数的技巧(linux读取文件行数)
- 解决Linux网口灯不亮的问题(linux网口灯不亮)
- 删除LVM:Linux系统必学技巧(linux删除lvm)
- Linux运维:实现服务持续可靠运行(linux运维做什么的)
- Linux为指定用户授予特殊权限(linux给指定用户授权)
- Linux:学习编程语言的必经之路(linux用的什么语言)
- Linux运维:打造安全可靠的系统环境(linux运维主要做什么)
- Linux运维:让智能硬件全新绽放(什么是linux运维)
- Linux使用强大的开发工具(linux用什么开发工具)
- 探索Linux中的字符串匹配功能(linux字符串匹配)
- Linux的强大特性:自由、安全、可扩展性(linux的特点是什么)
- Linux中栈空间的管理与优化(linux栈空间)
- 如何选择适合自己的Linux系统版本(linux有什么版本好)
- 解决Linux中DB2的卸载困难题(db2卸载linux)
- Linux 组:概述及相关知识(linux组是什么)
- Linux系统下高效杀毒保护(杀毒 for linux)
- Linux下创建文件夹的简便方法:建立文件夹链接(linux建立文件夹链接)
- 最好Linux系统:哪一个版本最适合自己?(linux系统什么版本)
- Linux: 开拓智能世界的利器(linux有什么用途)
- Linux用户组:管理用户的功能利器(linux用户组有什么用)