当我通过对话框/whiptail 调用获取脚本时,Shell 退出

当我通过对话框/whiptail 调用获取脚本时,Shell 退出

我有以下脚本:

#!/bin/bash

set -e

TITLE="Choose version"
VERSIONS=$(cat <<'END'
AAA
BBB
END
)

VERSION_LIST=$(echo "$VERSIONS" | awk '{print NR, " ", $0}')
INDEX=$(whiptail \
        --no-cancel \
        --menu "$TITLE" 15 40 15 \
        $VERSION_LIST \
        3>&1 1>&2 2>&3)

当我使其可执行并运行它时,它会按预期工作。当我从 bash 或 zsh 调用它时source,会发生以下情况之一:

  1. 终端关闭(bash 似乎退出)
  2. 终端保持打开状态,但很快就会崩溃/退出。最简单的重现方法是键入ls somefile并按TAB完成。

我使用的是 Fedora 29,我也可以在 Mac 操作系统上看到这种行为。在源脚本中使用whiptail/dialog 时是否需要考虑任何具体注意事项?

答案1

您的脚本errexit使用 来设置标志set -e。在您获取它之后,未经检查的失败命令将导致 shell 退出。如果您使用可编程完成脚本,其中一些脚本可能会运行失败的命令,这可以解释为什么制表符完成会触发它。

这里的解决方案是不获取脚本的源代码,而是照常运行它,或者对set -e所有相关命令进行足够的错误检查,并检查return它们是否失败。 (不是exit,因为这会退出整个 shell,return从源脚本返回。)

相关内容