web-dev-qa-db-ja.com

実行されたコマンドからエラーメッセージをキャプチャする方法

私は自動化されたサーバー強化スクリプトを作成することを任されました、そしてそれらが必要とする1つのことは実行された各コマンドのすべての出力のレポートです。エラーメッセージを文字列内に保存し、テキストファイルに追加したい。

このコマンドを実行したとしましょう:

/sbin/modprobe -n -v hfsplus

これを私のマシンで実行した場合の出力は次のようになります。

FATAL: Module hfsplus not found

そのエラーメッセージを文字列内に保存するにはどうすればよいですか?どんな助けでも大歓迎です。ありがとう!

22
Miguel Roque

エラーコマンドをリダイレクトすることでそれを行うことができます:

/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を使用してください

25
Nidal

単に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
15
graphite

このようにエラーをキャプチャします

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

ソースが失敗した場合は、エラーをキャプチャしてログに記録します。log_warnは単純な関数です。

ところで、私はこれを私の dotfiles で使用しています

4
wener

新しいbashバージョン(つまり、bash 4.1以降):

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

ファイルに追加するには、/sbin/modprobe -n -v hfsplus 2>> filenameを使用します

2
harish.venkat

変数でエラーメッセージを返すには、単純に、

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

echo $error
0
Jonathan