重定向和回傳程式碼

重定向和回傳程式碼

所以我有一個程式可能會或可能不會出現段錯誤(./segf)也將其他資料寫入 stderr。當程式出現段錯誤時,其回傳碼是139(即echo $?會列印139)。

我想將 stderr 重定向到/dev/null以避免列印它,但是這樣做 ( ./segf 2>1) 會導致返回代碼設為 1。

是否可以透過管道傳輸 stderr 的其他錯誤,同時仍能夠檢查回傳代碼是否為 139?

./segf >/dev/null; echo $?結果 139

./segf >/dev/null 2>1; echo $?結果為 1

bash -c './segf'結果 139

bash -c './segf' 2>1結果為 1

答案1

您嘗試過的任何操作都不會影響退出狀態。您可以使用這個非常簡單的腳本進行測試:

#!/bin/sh
echo out
echo err >&2
exit 139

現在使用各種重新導向來執行它:

$ foo.sh; echo $?
out
err
139

#redirect stdout to /dev/null and stderr to a file called '1'
$ foo.sh >/dev/null 2>1; echo $?
139

## Redirect stderr to /dev/null
$ foo.sh 2>/dev/null; echo $? 
out
139

重定向命令的 stderr 的方法只是command 2>/dev/null,但這永遠不會影響命令的退出狀態,除非重定向失敗。這實際上就是您的案例中可能發生的情況。如果您在所在目錄中沒有寫入權限,並且您嘗試執行./segf >/dev/null 2>1(而不是./segf >/dev/null 2>&1),則會嘗試建立一個文件呼叫1將 stderr 重定向到。如果無法建立文件,您將獲得退出狀態1

$ foo.sh 2>1; echo $? 
bash: 1: Permission denied
1

相關內容