ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

理解 shell 脚本中的常见用法: 2>&1

2022-05-15 10:34:05  阅读:207  来源: 互联网

标签:脚本 输出 shell foo cat 描述符 用法 output txt


理解 shell 脚本中的常见用法: 2>&1

原文链接  https://learnku.com/articles/54352

 

在我们接触的 shell 脚本中,对 2>&1 一定不陌生,比如 ls foo > /dev/null 2>&1。

 

本文就来解释下 2>&1 究竟做了什么,并且是如何起作用的。

 

一、I/O 重定向简介

「重定向」是计算机用来把命令的输出从一个地方,输出到另一个地方。举个例子,默认情况下,我们使用 cat 指令可以把一个文件的内容打印到终端:

 

$ cat foo.txt
foo
bar
baz

但是,我们可以把输出重定向到另外地方。此例中,我们可以把输出重定向到 output.txt 中:

 

$ cat foo.txt > output.txt


$ cat output.txt
foo
bar
baz

注意,在执行第一行命令 cat foo.txt > output.txt 时,我们在屏幕上看不到任何输出。我们把原来应该打印到屏幕的内容,重定向到 output.txt 了,所以屏幕上不会有任何输出了。

 

这里,「本来应该打印到屏幕的内容」,就是标准输出,即 stdout(standard output)。

 

除了标准输出可以接收程序的输出之外,还有一个地方可以,叫 标准错误输出,即 stderr(standard error)。stderr 用来接收程序的错误消息。例如,我们 cat 了一个不存在的文件:

 

$ cat nop.txt > output.txt
cat: nop.txt: No such file or directory

我们看到,虽然我们要求程序把输出重定向到 output.txt,但是我们还是在屏幕上看到了错误消息输出。这是因为我们只是重定向了 standard output,而不是 standard error。

 

二、文件描述符 (fd) 简介

文件描述符(file descriptor)简单来说,就是一个正整数,用来代表一个打开的文件。比如当前我们有 100 各打开的文件,那么就有 100 个文件描述符。

 

唯一需要补充的是,在 Unix 系统中,「一切皆文件」。

 

同时我们还应该知道,对于标准输出 (stdout) 和标准错误输出 (stderr),也有对应的文件描述符。我们使用 1 和 2 来分别表示 stdout 和 stderr 所在的位置。

 

三、融合上述知识

回到我们的第一个示例,我们还可以有另外一种写法

 

# 写法一
$ cat foo.txt > output.txt


# 等价写法二
$ cat foo.txt 1> output.txt

这里的 1 就是用来代表 stdout 的文件描述符。语法是 [FILE_DESCRIPTOR]>。我们看到把 1 省略的写法 > 只是 1> 的快捷写法而已。

 

对于重定向到 stderr 的场景,我们只需要在右边的文件前面加上文件描述符即可

 

$ cat nop.txt 2> error.txt


$ cat error.txt
cat: nop.txt: No such file or directory

你看,这样就生效了。这会儿,你大概知道 2>&1 是怎样工作的,让我们来总结总结。

 

我们使用 &1 来表示文件描述符 1 (stdout) 的地址。当你使用 2>&1 时,其实就是在说:把 stderr 的输出重定向到 stdout 的地方。这样,我们就可以把程序的标准输出和错误输出都输出到同一个地方了。

 

$ cat foo.txt > output.txt 2>&1


$ cat output.txt
foo
bar
baz


$ cat nop.txt > output.txt 2>&1


$ cat output.txt
cat: nop.txt: No such file or directory

四、总结

  • 程序可以把输出发送到两个地方:标准输出 (stdout,standard output) 和标准错误输出 (stderr,standard error)。
  • 你可以把输出重定向到另一个地方(比如文件)
  • 文件描述符 1 和 2 可以分别用来表示 stdout 和 stderr
  • command > output 是 command 1> output 的缩写
  • 可以使用 &[FILE_DESCRIPTOR] 来引用文件描述符的值(或者叫指向文件描述符的地址)
  • 使用 2>&1 来重定向 stderr 的输出至 stdout 的地方(你可以用 1>&2 来进行反向操作)

 

标签:脚本,输出,shell,foo,cat,描述符,用法,output,txt
来源: https://www.cnblogs.com/haoee/p/16272495.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有