Bash
當我使用對話框/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)
當我使它可執行並執行它時,它會按預期工作。當我
source
從 bash 或 zsh 呼叫它時,會發生以下情況之一:
- 終端關閉(bash 似乎退出了)
- 終端保持打開狀態,但很快就會崩潰/退出。最簡單的複制方法是鍵入
ls somefile
並按下TAB
完成。我正在使用 Fedora 29,我也可以在 Mac OS 上看到這種行為。在源腳本中使用whiptail/dialog 時是否需要考慮任何具體的考慮?
您的腳本
errexit
使用set -e
. 獲取它之後,未經檢查的失敗命令將導致 shell 退出。如果您使用可程式完成腳本,其中一些可能會執行失敗的命令,這將解釋為什麼製表符完成會觸發它。這裡的解決方案是不獲取腳本,而是像往常一樣執行它,或者替換
set -e
為對所有相關命令進行充分的錯誤檢查,以及return
它們是否失敗。(不是exit
,因為這會退出整個 shell,return
從源腳本返回。)