我有以下脚本:
#!/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
,会发生以下情况之一:
- 终端关闭(bash 似乎退出)
- 终端保持打开状态,但很快就会崩溃/退出。最简单的重现方法是键入
ls somefile
并按TAB完成。
我使用的是 Fedora 29,我也可以在 Mac 操作系统上看到这种行为。在源脚本中使用whiptail/dialog 时是否需要考虑任何具体注意事项?
答案1
您的脚本errexit
使用 来设置标志set -e
。在您获取它之后,未经检查的失败命令将导致 shell 退出。如果您使用可编程完成脚本,其中一些脚本可能会运行失败的命令,这可以解释为什么制表符完成会触发它。
这里的解决方案是不获取脚本的源代码,而是照常运行它,或者对set -e
所有相关命令进行足够的错误检查,并检查return
它们是否失败。 (不是exit
,因为这会退出整个 shell,return
从源脚本返回。)