我已经看到 bash 脚本中使用“exit”和“exec”来在发生错误时停止脚本执行。例如:

if [ ! -f file ]; then
echo "no file"
exit 1
fi

和:
if [ ! -f file ]; then
exec echo "no file"
fi

这里的最佳实践是什么,为什么?也欢迎对“exec”和“exit”进行更广泛的讨论/解释:)

最佳答案

exit刚退出 shell 程序,将指定的数字退出代码(如果省略则为0)返回到父进程。它等效于C库例程(也称为 exit )或从main返回。
exec用新的可执行镜像替换shell(仍在同一进程中运行),该镜像将在适当时候退出并向父进程返回一些代码或其他代码。它大致等效于C库例程 execvp

您的第一个示例几乎是(但不是完全)错误发生时停止脚本的正确方法。它应该读

if [ ! -f file ]; then
    echo "no file" >&2
    exit 1
fi

您的示例中缺少的>&2导致错误消息转到它所属的stderr而不是它不属于的stdout

您的第二个示例是错误的。除了将错误消息发送到错误的位置之外,exec echo将停止脚本(因为/bin/echo将执行其操作,然后退出),但是它将返回退出代码0到父进程。退出代码0表示成功。在Unix环境中运行的程序必须始终确保在失败时返回非零退出代码。
exec的正确用法是在shell脚本中进行一些设置工作,然后调用用另一种语言编写的长期存在的程序,此后再无事可做,因此没有任何必要使shell进程无所事事。例如:
#! /bin/sh
PATH=/special/directory/for/foo:$PATH
export PATH
exec foo

关于bash - "exec"和 "exit"在 bash 中的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8874596/

10-16 05:54