繁体   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