2011-11-09 51 views

回答

4

一種選擇是寫入文件,你確實有權限:

cp -R SourceDir DestDir 2>${TMPDIR:-/tmp}/out.$$.err 

另一種選擇是捕捉一個變量的錯誤(和非錯誤)輸出:

output=$(cp -R SourceDir DestDir 2>&1) 
echo "$output" 

注第一個變體創建一個特定於進程的臨時文件。這樣生成的文件名不是很安全;如果您以root身份在惡劣環境中工作,則需要採取更多預防措施來生成容易預測的文件名稱。對於大多數用戶來說,大部分時間就足夠了,特別是如果$TMPDIR環境變量指向某些目錄,例如其他用戶無法寫入的$HOME/tmp。使用包含$$的名稱可以確保如果兩個人同時運行腳本,它們不會意外地干擾彼此的日誌文件。

如果過程中斷,您還應該採取預防措施來清理文件。要做到這一點的方法是在這個樣板(模板)顯示:

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是進程接收的最可能的信號,並且在所有這些情況下,shell刪除臨時文件並以非零狀態退出(本例中爲1)。

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

該問題假設用戶沒有寫入'out.txt'的權限,所以我不清楚你的答案如何幫助。 –

相關問題