如何从执行的命令中捕获错误消息?

Mig*_*que 33 scripting bash string

我的任务是创建一个自动化的服务器强化脚本,他们需要的一件事是每个命令执行的所有输出的报告。我想将错误消息存储在一个字符串中并将其附加到一个文本文件中。

假设我运行了这个命令:

/sbin/modprobe -n -v hfsplus
Run Code Online (Sandbox Code Playgroud)

在我的机器上运行它的输出是:

FATAL: Module hfsplus not found
Run Code Online (Sandbox Code Playgroud)

如何将该错误消息存储在字符串中?任何帮助将不胜感激。谢谢!

Nid*_*dal 37

您可以通过重定向错误命令来实现:

/sbin/modprobe -n -v hfsplus 2> fileName 
Run Code Online (Sandbox Code Playgroud)

作为脚本

#!/bin/bash
errormessage=$( /sbin/modprobe -n -v hfsplus 2>&1)
echo $errormessage
Run Code Online (Sandbox Code Playgroud)

或者

 #!/bin/bash
errormessage=`/sbin/modprobe -n -v hfsplus 2>&1 `
echo $errormessage
Run Code Online (Sandbox Code Playgroud)

如果你想追加错误使用>>而不是>

确保使用2>&1而不是2> &1避免错误“意外标记‘&’附近的语法错误”


gra*_*ite 18

只需在 bash 脚本中存储为字符串:

X=`/sbin/modprobe -n -v hfsplus 2>&1`
echo $X
Run Code Online (Sandbox Code Playgroud)

这可能会好一点,因为您会在执行命令时看到消息:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP
Run Code Online (Sandbox Code Playgroud)


小智 9

要在变量中返回错误消息,很简单;

error=$(/sbin/modprobe -n -v hfsplus 2>&1 1>/dev/null)

echo $error
Run Code Online (Sandbox Code Playgroud)

  • 这就是答案,因为其他的会将标准输出附加到变量中。通常,您想知道该消息是否来自错误,这是完美的。例如,发出警告或处理脚本中的不良情况。 (2认同)

小智 6

较新的 bash 版本(即 bash 4.1+):

$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$ 
Run Code Online (Sandbox Code Playgroud)