我已经看到在bash脚本中使用"exit"和"exec"来在发生错误时停止脚本执行.例如:
if [ ! -f file ]; then
echo "no file"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
和:
if [ ! -f file ]; then
exec echo "no file"
fi
Run Code Online (Sandbox Code Playgroud)
这里最好的做法是什么?为什么?关于"exec"和"exit"的更广泛的讨论/解释也是受欢迎的:)
zwo*_*wol 14
exit只退出shell,将指定的数字退出代码(如果省略则返回0)返回到父进程.它等同于也调用的C库例程exit,或者从中返回main.
exec 用新的可执行映像(仍然在同一进程中运行)替换 shell,这将在适当的时候退出并返回一些代码或其他代码到父进程.它大致相当于C库例程execvp.
您的第一个示例几乎(但不完全)是在发生错误时停止脚本的正确方法.它应该读
if [ ! -f file ]; then
echo "no file" >&2
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
的>&2,这是从你的榜样缺失,导致该错误消息去stderr,它所属的,而不是stdout,它不属于.
你的第二个例子是错的.除了错误信息发送到错误的地方,exec echo将停止脚本(因为它/bin/echo会做它的事情,然后退出)但它将返回退出代码0到父进程.退出代码0表示成功.在Unix环境中运行的程序必须始终确保在失败时返回非零退出代码.
正确使用execshell脚本进行一些设置工作,然后调用用另一种语言编写的长期程序,之后没有任何事情可做,所以没有必要保持shell进程不变.例如:
#! /bin/sh
PATH=/special/directory/for/foo:$PATH
export PATH
exec foo
Run Code Online (Sandbox Code Playgroud)