我有以下 shell 脚本:
error=$(mkdir test 2>&1)
我知道如果有错误,变量“error”将获得 mkdir 命令的错误结果,但我无法理解 2>&1 是如何工作的,有人可以解释一下吗?谢谢!
答案1
语法
x="$(some_command)"
将运行some_command
并且输出返回并存储在变量中"$x"
。
现在,通常情况下,程序将“正常输出”发送到“标准输出”流(stdout
,文件句柄#1),并将错误消息发送到“标准错误”流(stderr
,文件句柄#2)。
重定向语义2>&1
意味着(粗略地说;实际上有点复杂)“发送stderr
到stdout
”。因此错误消息和输出消息混合在一起。
所以我们可以将两者结合起来:
x="$(some_command 2>&1)"
将返回输出和错误消息并将它们放入$x
.
在你的情况下
error="$(mkdir test 2>&1)"
意味着$error
将包含输出(为空)和错误(可能如果发生错误,则包含一个字符串)。结果 $error
将包含命令中的任何错误消息mkdir
。
我们可以看到这一点的实际应用。
$ error="$(mkdir /)"
mkdir: cannot create directory '/': File exists
$ echo "$error"
$ error="$(mkdir / 2>&1)"
$ echo "$error"
mkdir: cannot create directory '/': File exists
在第一种情况下,错误消息会立即打印,因为它被发送到stderr
,并且变量为空。在第二种情况下,我们将 stderr 重定向到 stdout,因此它被捕获并存储在变量中$error
。
答案2
从诗意的角度来说,这意味着:将错误流发送到与正常输出相同的“通道”。2
代表错误。1
是主线,还是标准输出。&1
指示标准输出的去向。默认情况下,它会转到屏幕,并且在这个替换上下文中:$( )
,它会转到变量,成为它的值。并且>
是重定向。全部在一起2>&1
意味着:以标准输出的方式重定向错误。
答案3
$()
它通过将 stderr 重定向到 stdout 来捕获 stderr 和 stdout(在命令替换将 stdout 连接到父 shell 的管道后生效)。
in使得引用另一个文件描述符和打开一个&
名为.>&1
1
2>
像往常一样重定向 stderr 的方法。