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

时间:2014-01-31 13:29:38

标签: bash shell unix

我正在尝试将复制命令的错误消息存储到变量中。但它没有发生

Unix命令

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

echo $log

<nothing displayed>

我想将上面的错误信息存储到变量中,这样我就可以随时回复它

1 个答案:

答案 0 :(得分:5)

只需将stdout(正常输出)重定向到/dev/null并保留stderror:

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,以便保留格式。此外,最好不要使用$()而不是, as it is easier to nest and also


What does 2>&1 mean?

  

1是标准输出。 2是stderr。

     

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