首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux中>,>>,>&,&>,&,&&,|,||,2>&1到底是什么?

Linux中>,>>,>&,&>,&,&&,|,||,2>&1到底是什么?

作者头像
自学气象人
发布2022-11-14 16:06:10
发布2022-11-14 16:06:10
4.2K00
代码可运行
举报
文章被收录于专栏:自学气象人自学气象人
运行总次数:0
代码可运行

前言

在linux中我们时常能见到>,>>,>&,&>,&,&&,|,||,2>&1等符号,它们到底是什么?下面浅谈一下我的看法,如有不对的地方请大家及时指正!

linux中的文件描述符和重定向

文件描述符

在介绍上述符号表示什么之前,我们需要先知道在linux中有三种标准的文件描述符(也支持自定义),分别为:

  • • 0:表示标准输入(stdin)
  • • 1:表示标准输出(stdout)
  • • 2:表示标准错误(stderr)

举个简单的例子,当我们ls一个不存在的文件时,会报错如下:

代码语言:javascript
代码运行次数:0
运行
复制
[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脚本。

代码语言:javascript
代码运行次数:0
运行
复制
[zhxia@aemol ~]$ cat test.py
print('Hello World')

可以看到脚本中只有一行代码。现在我在linux上用python test.py运行脚本,它本来是要输出Hello World到屏幕的,但现在我不让它直接输出到屏幕上,而是存在了output.log日志文件中,这就叫将标准输出重定向到output.log文件中。

那要实现这个目的,我们可以这样写:

代码语言:javascript
代码运行次数:0
运行
复制
[zhxia@aemol ~]$ python test.py >output.log 

查看output.log文件可以发现已经将Hello World写入了:

代码语言:javascript
代码运行次数:0
运行
复制
[zhxia@aemol ~]$ cat output.log
Hello World

>和>>

>

用于将标准输出重定向至文件。如上面的例子,将Hello World写入了output.log日志文件中而不是显示在屏幕上。

代码语言:javascript
代码运行次数:0
运行
复制
[zhxia@aemol ~]$ python test.py >output.log 
[zhxia@aemol ~]$ cat output.log
Hello World

>>

>>>的区别在于>是覆写文件而>>是追加文件。即对于>,当文件存在时会先删除原文件,再重新创建文件,然后把内容写入该文件;否则直接创建文件。而对于>>,当文件存在时直接在文件末尾进行内容追加,不会删除原文件;否则直接创建文件。举个简单的例子如下:

代码语言:javascript
代码运行次数:0
运行
复制
[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

>&和&>

>&&>在很多情况下是可以互换的,它们与>的区别在于:>只能将标准输出重定向(对于标准错误依然会显示在屏幕上),而>&&>可以将标准输出或标准错误都重定向输出。

举例如下:

代码语言:javascript
代码运行次数:0
运行
复制
[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

>&

>&后面既可以识别文件,可以识别文件描述符。

  • • 当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件。
代码语言:javascript
代码运行次数:0
运行
复制
[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:
代码语言:javascript
代码运行次数:0
运行
复制
[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

&>

&>后面只可以识别文件。

  • • 当&>后面接文件时,可与>&互相替换,都表示将标准输出和标准错误输出重定向至文件。
代码语言:javascript
代码运行次数:0
运行
复制
[zhxia@aemol ~]$ ls donot_exist.txt &>output.log 
[zhxia@aemol ~]$ cat output.log
ls: cannot access donot_exist.txt: No such file or directory
  • • 当&>后面接文件描述符时,表示将标准输出和标准错误输出重定向至与文件描述符同名的文件。
代码语言:javascript
代码运行次数:0
运行
复制
[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&>1ls donot_exist.txt 2 &>1等价。

&和&&

&

&表示将任务提交到后台运行。可以通过jobs命令查看任务状态。

代码语言:javascript
代码运行次数:0
运行
复制
[zhxia@aemol ~]$python test.py &>output.log &
[1] 220546
[zhxia@aemol ~]$ jobs
[1]+  Done    python test.py &>output.log

&&

&&表示表示前一条命令执行成功后,才执行后一条命令。

代码语言:javascript
代码运行次数:0
运行
复制
[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

|和||

|

|表示管道,即将上一条命令的输出,作为下一条命令的输入参数。

代码语言:javascript
代码运行次数:0
运行
复制
[zhxia@aemol ~]$ ls
output.log  test.py
[zhxia@aemol ~]$ ls | grep test.py
test.py

||

||表示表示前一条命令执行失败后,才执行后一条命令。

代码语言:javascript
代码运行次数:0
运行
复制
[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中。

代码语言:javascript
代码运行次数:0
运行
复制
[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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学气象人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • linux中的文件描述符和重定向
      • 文件描述符
      • 重定向
    • >和>>
      • >
      • >>
    • >&和&>
      • >&
      • &>
    • &和&&
      • &
      • &&
    • |和||
      • |
      • ||
    • 2&>1
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档