簡體   English   中英

可以bash echo命令返回非零退出代碼嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM