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

log*_*gan 4 unix bash shell

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

Unix命令

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

echo $log

<nothing displayed>
Run Code Online (Sandbox Code Playgroud)

我想将上面的错误消息存储到变量中,以便我可以随时回应它

fed*_*qui 5

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

a=$(cp log.txt 2>&1 >/dev/null)
Run Code Online (Sandbox Code Playgroud)

看一个例子:

$ a=$(cp log.txt 2>&1 >/dev/null)
$ echo "$a"
cp: missing destination file operand after ‘log.txt’
Try 'cp --help' for more information.
Run Code Online (Sandbox Code Playgroud)

>/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
Run Code Online (Sandbox Code Playgroud)

请注意$a在调用它时需要引用,以便保留格式.此外,最好使用$()而不是, as it is easier to nest and also弃用.


什么2>&1意思?

1是标准输出.2是stderr.

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