bash中"exec"和"exit"之间的区别

Mar*_*tin 4 bash exec exit

我已经看到在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)