web-dev-qa-db-ja.com

ダイアログ/ホイップテール呼び出しでスクリプトをソースすると、シェルが終了します

私は次のスクリプトを持っています:

#!/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 完成のために。

私はFedora29を使用していますが、MacOSでもこの動作を確認できます。ソーススクリプトでホイップテール/ダイアログを使用するときに考慮する必要がある特定の考慮事項はありますか?

2
John Doe

スクリプトは、errexitフラグをset -eで設定します。それを調達した後、チェックされていない失敗したコマンドはシェルを終了させます。プログラム可能な補完スクリプトを使用している場合、一部のスクリプトで失敗するコマンドが実行される可能性があります。これにより、タブ補完によってトリガーされる理由が説明されます。

ここでの解決策は、スクリプトを入手せずに通常どおりに実行するか、set -eを関連するすべてのコマンドで十分なエラーチェックに置き換え、失敗した場合はreturnに置き換えることです。 (exitではありません。シェル全体が終了するため、returnはソーススクリプトから返されます。)

4
ilkkachu