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

Vla*_*nov 4 bash shell-script dialog

我有以下脚本:

#!/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)
Run Code Online (Sandbox Code Playgroud)

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

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

我正在使用 Fedora 29,我也可以在 Mac OS 上看到这种行为。在源脚本中使用whiptail/dialog 时,是否需要考虑任何特定的考虑因素?

ilk*_*chu 8

您的脚本errexit使用set -e. 获取它后,未经检查的失败命令将导致 shell 退出。如果您使用可编程完成脚本,其中一些可能会运行失败的命令,这将解释制表符完成触发它的原因。

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