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