Pat*_*son 4 shell bash io-redirection command-substitution
我有以下 shell 脚本:
error=$(mkdir test 2>&1)
Run Code Online (Sandbox Code Playgroud)
我知道如果出现错误,变量 'error' 会得到 mkdir 命令的错误结果,但我不明白 2>&1 是如何工作的,有人可以解释一下吗?谢谢!
Ste*_*ris 10
语法
x="$(some_command)"
Run Code Online (Sandbox Code Playgroud)
将运行some_command并返回其输出并存储在变量中"$x"。
现在,通常,程序将“正常输出”发送到“标准输出”流(stdout,文件句柄 #1),并将错误消息发送到“标准错误”流(stderr,文件句柄 #2)。
重定向语义的2>&1意思是(粗略地说;它在幕后稍微复杂一些)“发送stderr到stdout”。因此错误消息和输出消息混合在一起。
所以我们可以将两者结合起来:
x="$(some_command 2>&1)"
Run Code Online (Sandbox Code Playgroud)
将返回输出和错误消息并将它们放入$x.
在你的情况下
error="$(mkdir test 2>&1)"
Run Code Online (Sandbox Code Playgroud)
意味着$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
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,错误消息会立即打印,因为它被发送到stderr,并且变量为空。在第二种情况下,我们将 stderr 重定向到 stdout,因此它被捕获并存储在$error变量中。