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

jdf*_*jdf 7 unix bash sh echo

就像标题所说,有什么情况下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
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,如果echo退出非零,则&&逻辑中断,我们永远不会退出1,我们将永远循环.任何危险/边缘情况,回声可以退出非零?

Mr.*_*ama 7

不,没风险.来自man bash:

echo [-neE] [arg ...]
输出args,用空格分隔,后跟换行符. 返回状态始终为0.如果-n指定,则抑制尾随换行符.如果-e给出该选项,则启用对以下反斜杠转义字符的解释.该-E选项禁用这些转义字符的解释,即使在默认情况下解释它们的系统上也是如此.所述xpg_echo壳选项可以被用于动态地确定是否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
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 7

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

引用 bash 手册:

'回声'

回声 [-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
$ 
Run Code Online (Sandbox Code Playgroud)

/dev/full是一个设备,/dev/zero除了任何写入它的尝试都将失败并显示ENOSPC错误之外,与此类似。