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


20

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

假设我运行了以下命令:

/sbin/modprobe -n -v hfsplus

在我的机器上运行此命令的输出为:

FATAL: Module hfsplus not found

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


我尝试运行此命令:var = $(/ sbin / modprobe -n -v hfsplush)然后显示它:$ var但是它仍然无法捕获字符串中的错误消息。
米格尔·罗克

Answers:


23

您可以通过重定向错误命令来做到这一点:

/sbin/modprobe -n -v hfsplus 2> fileName 

作为脚本

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

要么

 #!/bin/bash
errormessage=`/sbin/modprobe -n -v hfsplus 2>&1 `
echo $errormessage

如果要附加错误,请使用>>代替>

确保使用2>&1而不是2> &1避免出现错误“意外令牌'&'附近的语法错误”


我尝试了这种方法,并将其直接存储在文本文件中。我希望它首先存储在字符串中,以便可以轻松格式化内容。
米格尔·罗克

1
@MiguelRoque看到更新
Networker

1
我尝试将输出放入HEREDOC中,它也起作用。非常感谢@Networker!
米格尔·罗克

1
有人还原了我所做的编辑,因为我在“&附近有语法错误”,并在>后删除了空格。理由会很好。
Pierre.Sassoulas

我尝试进行编辑是因为:确保使用2>&1,而不是2>&1,以避免出现错误“语法错误,意外标记'&'附近”
peter_v

15

只需存储为bash脚本中的字符串即可:

X=`/sbin/modprobe -n -v hfsplus 2>&1`
echo $X

这样会更好一些,因为在执行命令时您会看到消息:

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

1
始终使用$(command)而不是反引号代替命令。更好:)
Sree 2015年

我知道它更好(使用$()遇到的问题更少),但是为什么呢?
KolonUK

4

我捕获这样的错误

. ${file} 2>&1 | {
  read -d "\0" -t 0.01 error
    [ -z "$error" ] || log_warn Load completion ${file} failed: "\n${error}"
}

如果源失败,我将捕获错误并将其记录。log_warn只是一个简单的函数。

顺便说一句,我在我的点文件中使用它



2

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

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

0

要在变量中返回错误消息,只需简单地;

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

echo $error
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.