[英]Can bash echo command return non-zero exit code?
就像標題所說,有什么情況下echo會在bash / sh中退出非零值?
代碼ex。
until monitor_thing_happens; do
test $retry_counter -eq 0 && echo "thing didn't happen" && exit 1
let "retry_counter--"
echo "tries remaining: ${retry_counter}"
sleep 5
done
在上面的例子中,如果echo退出非零,則&&邏輯中斷,我們永遠不會退出1,我們將永遠循環。 任何危險/邊緣情況,回聲可以退出非零?
不,沒風險。 來自man bash
:
echo [-neE] [arg ...]
輸出args,用空格分隔,后跟換行符。 返回狀態始終為0.如果指定了-n
,則抑制尾隨換行符。 如果給出-e
選項,則啟用對以下反斜杠轉義字符的解釋。-E
選項禁用這些轉義字符的解釋,即使在默認情況下解釋它們的系統上也是如此。xpg_echo
shell選項可用於動態確定echo
是否默認擴展這些轉義字符。echo
不解釋--
意味着選項的結束。 echo解釋以下轉義序列:
強調“返回狀態始終為0”。
從代碼質量的角度來看,我建議不要使用test
除非你因shell兼容性原因而被迫。 通常,使用[[
,但對於算術表達式,您也可以使用((
:
# The generic way
[[ $retry_counter -eq 0 ]] && echo "Thing didn't happen" && exit 1
# The arithmetic way
(( retry_counter == 0 )) && echo "Thing didn't happen" && exit 1
是的,如果出現寫入錯誤, echo
返回狀態為非零。
引用bash手冊:
'回聲'
echo [-neE] [ARG ...]
輸出由空格分隔的ARG,以換行符結尾。 除非發生寫入錯誤,否則返回狀態為0。
示范:
$ cat foo.bash
#!/bin/bash
echo hello
echo "The echo command returned a status of $?" > /dev/tty
$ ./foo.bash > /dev/full
./foo.bash: line 3: echo: write error: No space left on device
The echo command returned a status of 1
$
/dev/full
是一個設備,類似於/dev/zero
除了任何嘗試寫入它都會因ENOSPC
錯誤而失敗。
來自help man
(bash):
退出狀態:
除非發生寫入錯誤,否則返回成功。
更新
因此,如果您echo
到突然失敗的流,您將獲得另一個退出代碼。
不同的評論顯示風險。 你可以試試
retry_counter=5
while [ retry_counter -gt 0 ]; do
monitor_thing_happens && break
(( retry_counter-- ))
echo "tries remaining: ${retry_counter}"
sleep 5
done
不是沒風險! 當函數monitor_things_happen
重置相同的變量retry_counter
,循環將運行很長時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.