Bash 将命令输出的错误消息存储到shell变量中

Bash 将命令输出的错误消息存储到shell变量中,bash,shell,unix,Bash,Shell,Unix,我试图将copy命令的错误信息存储到变量中。但这并没有发生 Unix命令 log=`cp log.txt` cp: missing destination file operand after `log.txt' Try `cp --help' for more information. echo $log <nothing displayed> log=`cp log.txt` cp:'log.txt'之后缺少目标文件操作数 有关详细信息,请尝试“cp--help”。 ech

我试图将copy命令的错误信息存储到变量中。但这并没有发生

Unix命令

log=`cp log.txt`
cp: missing destination file operand after `log.txt'
Try `cp --help' for more information.

echo $log

<nothing displayed>
log=`cp log.txt`
cp:'log.txt'之后缺少目标文件操作数
有关详细信息,请尝试“cp--help”。
echo$log
我想将上面的错误消息存储到一个变量中,这样我就可以在任何时候回显它,只要将标准输出重定向到
/dev/null
,并保留标准错误:

a=$(cp log.txt 2>&1 >/dev/null)
请参见一个示例:

$ a=$(cp log.txt 2>&1 >/dev/null)
$ echo "$a"
cp: missing destination file operand after ‘log.txt’
Try 'cp --help' for more information.
/dev/null
保持正常输出的重要性,在这种情况下,我们不希望:

$ ls a b
ls: cannot access a: No such file or directory
b
$ a=$(ls a b 2>&1)
$ echo "$a"
ls: cannot access a: No such file or directory
b
$ a=$(ls a b 2>&1 >/dev/null)
$ echo "$a"
ls: cannot access a: No such file or directory
请注意,调用时需要引用
$a
,以便保留格式。另外,最好使用
$()
而不是
,因为它更容易嵌套,而且也不推荐使用


1是标准。2是标准

这里有一种方法可以记住这个结构(尽管它并不完全是 准确):首先,
2>1
看起来是重定向stderr的好方法 到stdout。然而,它实际上将被解释为“重定向” stderr到名为
1
”的文件<代码>&
表示下面是一个文件 描述符,而不是文件名。因此,构造变成:
2>&1


请解释,以便我可以标记为答案:)由于devnull在其删除的答案中进行了注释,您也可以查看我的更新答案。对于同时写入标准输出和标准错误的命令,您将希望在重定向标准错误后丢弃标准输出:
$(command 2>&1>/dev/null)
。您完全正确,@chepner,刚刚更新了一个你评论的例子。谢谢