2011-11-09 3 views

答えて

4

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)で終了します。

1
cp -R SourceDir DestDir 2>out.txt 
[ $? -eq 0 ] && { result="out.txt" } || echo 'no permission' 
+0

質問には、ユーザーが「out.txt」に書き込む権限を持っていないとの疑問があるため、回答がどのように役立つかはわかりません。 –

関連する問題