Bash

當我使用對話框/whiptail 呼叫獲取腳本時,Shell 退出

  • February 13, 2019

我有以下腳本:

#!/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)

當我使它可執行並執行它時,它會按預期工作。當我source從 bash 或 zsh 呼叫它時,會發生以下情況之一:

  1. 終端關閉(bash 似乎退出了)
  2. 終端保持打開狀態,但很快就會崩潰/退出。最簡單的複制方法是鍵入ls somefile並按下TAB完成。

我正在使用 Fedora 29,我也可以在 Mac OS 上看到這種行為。在源腳本中使用whiptail/dialog 時是否需要考慮任何具體的考慮?

您的腳本errexit使用set -e. 獲取它之後,未經檢查的失敗命令將導致 shell 退出。如果您使用可程式完成腳本,其中一些可能會執行失敗的命令,這將解釋為什麼製表符完成會觸發它。

這裡的解決方案是不獲取腳本,而是像往常一樣執行它,或者替換set -e為對所有相關命令進行充分的錯誤檢查,以及return它們是否失敗。(不是exit,因為這會退出整個 shell,return從源腳本返回。)

引用自:https://unix.stackexchange.com/questions/500371