我有簡單的命令的錯誤結果:是否有可能發送錯誤輸出到bash中的變量?
cp -R SourceDir DestDir 2>out.txt
result="out.txt"
但如果腳本沒有權限寫的,我怎麼能得到可變結果錯誤輸出?
我有簡單的命令的錯誤結果:是否有可能發送錯誤輸出到bash中的變量?
cp -R SourceDir DestDir 2>out.txt
result="out.txt"
但如果腳本沒有權限寫的,我怎麼能得到可變結果錯誤輸出?
一種選擇是寫入文件,你確實有權限:
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)。
cp -R SourceDir DestDir 2>out.txt
[ $? -eq 0 ] && { result="out.txt" } || echo 'no permission'
該問題假設用戶沒有寫入'out.txt'的權限,所以我不清楚你的答案如何幫助。 –