私は、単純なコマンドのエラー結果を持っている:エラー出力をbashの変数に送ることはできますか?
cp -R SourceDir DestDir 2>out.txt
result="out.txt"
しかし、スクリプトが書き込みの許可を持っていない場合、どのように私は、変数の結果でエラー出力を得ることができますか?
私は、単純なコマンドのエラー結果を持っている:エラー出力をbashの変数に送ることはできますか?
cp -R SourceDir DestDir 2>out.txt
result="out.txt"
しかし、スクリプトが書き込みの許可を持っていない場合、どのように私は、変数の結果でエラー出力を得ることができますか?
1つのオプションは、あなたが権限を持っているファイルを作成することです:
output=$(cp -R SourceDir DestDir 2>&1)
echo "$output"
注:
cp -R SourceDir DestDir 2>${TMPDIR:-/tmp}/out.$$.err
別のオプションは、変数にエラー(非エラー)出力をキャプチャすることです最初の変更がプロセス固有の一時ファイルを作成することを示します。このように生成されたファイル名はあまり安全ではありません。あなたが敵対的な環境でrootとして作業している場合、そのような簡単に予測されるファイル名を生成するために、より多くの注意を払う必要があります。ほとんどのユーザーにとっては、特に、$TMPDIR
環境変数が、他のユーザーが書き込めない$HOME/tmp
などのディレクトリを指している場合は、十分です。 $$
を含む名前を使用すると、2人で同時にスクリプトを実行すると、誤って互いのログファイルに干渉しないようになります。
プロセスが中断された場合は、ファイルをクリーンアップする必要があります。それを行う方法は、この定型(テンプレート)に示されている:
tmp=${TMPDIR:-/tmp}/out.$$.err
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15 # EXIT HUP INT QUIT PIPE TERM
# Command using temporary file
cp -R SourceDir DestDir 2>$tmp
# Analyse contents...
# Clean up
rm -f $tmp
trap 0
exit 0
あなたがゼロ以外のステータスで終了することができます
(exit $status
)。要点は、ファイルを削除して、 '終了時のトラップ'をキャンセルすることです。シグナルHUP、INT、QUIT、PIPE、およびTERMは、プロセスが受信する可能性が最も高いものであり、これらの場合、シェルは一時ファイルを削除し、非ゼロステータス(この例では1)で終了します。
cp -R SourceDir DestDir 2>out.txt
[ $? -eq 0 ] && { result="out.txt" } || echo 'no permission'
質問には、ユーザーが「out.txt」に書き込む権限を持っていないとの疑問があるため、回答がどのように役立つかはわかりません。 –