私は自動化されたサーバー強化スクリプトを作成することを任されました、そしてそれらが必要とする1つのことは実行された各コマンドのすべての出力のレポートです。エラーメッセージを文字列内に保存し、テキストファイルに追加したい。
このコマンドを実行したとしましょう:
/sbin/modprobe -n -v hfsplus
これを私のマシンで実行した場合の出力は次のようになります。
FATAL: Module hfsplus not found
そのエラーメッセージを文字列内に保存するにはどうすればよいですか?どんな助けでも大歓迎です。ありがとう!
エラーコマンドをリダイレクトすることでそれを行うことができます:
/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
を使用してください
単に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
このようにエラーをキャプチャします
. ${file} 2>&1 | {
read -d "\0" -t 0.01 error
[ -z "$error" ] || log_warn Load completion ${file} failed: "\n${error}"
}
ソースが失敗した場合は、エラーをキャプチャしてログに記録します。log_warnは単純な関数です。
ところで、私はこれを私の dotfiles で使用しています
新しいbashバージョン(つまり、bash 4.1以降):
$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$
ファイルに追加するには、/sbin/modprobe -n -v hfsplus 2>> filename
を使用します
変数でエラーメッセージを返すには、単純に、
error=$(/sbin/modprobe -n -v hfsplus 2>&1 1>/dev/null)
echo $error