error=$(mkdir test 2>&1) 该表达式的含义是什么?

error=$(mkdir test 2>&1) 该表达式的含义是什么?

我有以下 shell 脚本:

error=$(mkdir test 2>&1)

我知道如果有错误,变量“error”将获得 mkdir 命令的错误结果,但我无法理解 2>&1 是如何工作的,有人可以解释一下吗?谢谢!

答案1

语法

x="$(some_command)"

将运行some_command并且输出返回并存储在变量中"$x"

现在,通常情况下,程序将“正常输出”发送到“标准输出”流(stdout,文件句柄#1),并将错误消息发送到“标准错误”流(stderr,文件句柄#2)。

重定向语义2>&1意味着(粗略地说;实际上有点复杂)“发送stderrstdout”。因此错误消息和输出消息混合在一起。

所以我们可以将两者结合起来:

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使得引用另一个文件描述符和打开一个&名为.>&11

2>像往常一样重定向 stderr 的方法。

相关内容