在脚本中正确处理权限错误

在脚本中正确处理权限错误

我有一个脚本,它基于描述所有模块的 JSON 文件来安装多个模块。

在每个模块上循环,我调用它的安装脚本。

# Create install log destination
install_log=install_log/`date -Iseconds | awk -F '+' '{print $1}'`".log"
echo -e "To monitor installation:\ntail -f `pwd`/$install_log"
# Install
./install > $install_log                # <- This file sometimes does not have the x bit
if [ $? -eq 1 ]; then # Check install exit code
    echo -e "\n"
    cat $install_log | tail -n 35
    echo -e "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n~~~ Install of module $module_name failed ~~~\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n"
    exit 1;
fi

install脚本没有x位时,它会抛出权限错误消息。但是,$?测试不会捕获错误情况,脚本会继续。

发生这种情况时如何让我的脚本停止?

答案1

字面解法

代替

./install > $install_log # <- This line sometimes does not have the x bit
if [ $? -eq 1 ]; then # Check install exit code
    # ...
    exit 1;
fi

您可以:

  1. 利用退出状态 0 代表成功的一般约定,以及if条件结构!保留字:
if ! ./install > "$install_log"; then
    # ...
    exit 1
fi

如果确切的错误代码并不重要,而只是尝试执行脚本的一般成功或失败。

  1. 否则,正如其他人在评论中所建议的那样,您可以保存变量的内容$?,然后以任何可能的方式使用它:
./install > "$install_log"
exit_code=$?
if [ $exit_code -eq 126 ]; then
    # ...
    exit 1
fi

不同的方法

但是,我认为问题本身的方法需要修改。在安装脚本的上下文中,使安装成功可能更有利。这可以通过多种方式来实现,最值得注意的是:

  1. 通过前置chmod +x install,设置文件的执行位安装:
chmod +x install
if ! ./install > "$install_log"; then
    # ...
    exit 1
fi
  1. 通过传递脚本。/安装作为用户 shell 的参数:
if ! "${SHELL:-/bin/bash}" ./install > "$install_log"; then
    # ...
    exit 1
fi

或直接所需/预期的外壳:

if ! bash ./install > "$install_log"; then
    # ...
    exit 1
fi

相关内容