我想知道何时在代码块中使用 return 0 和 return 1
有人可以详细说明一下吗
答案1
在 Bash 中,您可以从函数返回任何值,但它会被截断为 8 位并变为无符号。当您使用 $? 检查它时,它将在 0..255 范围内。如果不使用 return 来提供状态,则该函数将返回该函数内执行的最后一个命令的状态。
同样的$?替换机制用于从外部命令和用户函数获取状态。但是,对于外部命令,还有其他保留值。由于在大型脚本中哪些调用是对 shell 函数的调用以及哪些调用是对外部命令的调用可能并不明显,所以谨慎的做法是遵循相同的约定,即:
0:成功。如果启用了 shell -e 选项,则返回非零状态将退出脚本,即使该命令实际上有效。
>128:命令被信号终止,因此无法返回完成状态。系统提供的状态为(128 + 信号编号)。
127:shell启动了一个新进程,但找不到命令。
126:shell启动了一个新进程,但发现命令不可执行。
我对此的参考是
https://www.gnu.org/software/bash/manual/bash.html#Exit-Status
同一文档的 4.3.1 节包含对 set -e 的描述,它显示了 Bash 如何为状态 0 分配特殊含义。每个命令的手册页的退出状态部分都证实了这一点。
我在这里没有看到“无法分叉”的代码:126 和 127 似乎都是从 shell 自己的子进程返回的。 fork() 肯定会失败(返回 -1、errno EAGAIN 或 ENOMEM),但 Bash 没有指定由此产生的状态:显然,如果失败,则没有子进程来处理它。
设置最大用户进程数并启动新的 bash 的实验破坏了 Bash,以至于在尝试读取状态时无法响应。
Paul--) prlimit --nproc=400: bash
paul@paul-RV415-RV515 ~ $ export PS1='Limited--) '
Limited--) for j in {1..500}; do
> sleep 300 &
> Rc=$?
> (( Rc > 0 )) && { echo "${Rc}"; break; }
> done
[1] 5954
[2] 5955
....
[53] 6006
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
[54] 6007
[55] 6008
bash: fork: retry: Resource temporarily unavailable
....
[59] 6012
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
Limited--) RC=$?
^C
^C^C
## Killed from another terminal.
答案2
0 表示没有错误。任何其他值都意味着出了问题;甚至可以返回负值。
AFAIK 除了 0 之外,没有其他返回值标准。如果您想返回非 0 的值,则需要您告诉程序的用户不同值/错误代码的含义。