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


20

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

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

/sbin/modprobe -n -v hfsplus

私のマシンでこれを実行すると、出力は次のようになります。

FATAL: Module hfsplus not found

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


次のコマンドを実行してみました:var = $(/ sbin / modprobe -n -v hfsplush)そして、それを表示します:$ varしかし、それでも文字列内のエラーメッセージをキャプチャしません。
ミゲルロケ

回答:


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)を使用します。それは良いです:)
スリー

私はそれが良いことを知っています($()を使用して問題が少なくなりました)が、それはなぜですか?
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.