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