可以bash echo命令返回非零退出代码吗?

时间:2016-04-15 15:57:19

标签: bash unix echo sh

就像标题所说,有什么情况下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,我们永远循环。任何有回声可以退出非零的危险/边缘情况?

4 个答案:

答案 0 :(得分:7)

不,没风险。来自man bash

  

echo [-neE] [arg ...]
  输出args,用空格分隔,后跟换行符。   返回状态始终为0. 如果指定了-n,则为尾随   换行被抑制。如果给出-e选项,则解释   启用以下反斜杠转义字符。 -E选项   禁用这些转义字符的解释,即使在系统上也是如此   它们在默认情况下被解释。 xpg_echo shell选项可以   用于动态确定echo是否扩展了这些   默认情况下转义字符。 echo并未将--解释为   选项结束。 echo解释以下转义序列:

强调"返回状态始终为0"。

从代码质量的角度来看,我建议not using test,除非您因shell兼容性原因而被迫。通常,使用[[,但对于arithmetic expressions,您也可以使用((

# 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

答案 1 :(得分:2)

来自help man(bash):

  

退出状态:

     

除非发生写入错误,否则返回成功。

<强>已更新

因此,如果您echo突然失败的流,您将获得另一个退出代码。

答案 2 :(得分:2)

是的,echo如果出现写入错误,则返回状态为非零。

引用bash手册:

  

&#39;回波&#39;

     

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错误而失败。

答案 3 :(得分:1)

不同的评论显示风险。 你可以尝试

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时,循环将运行很长时间。