ダイアログ/ホイップテールを介してインポートスクリプトを呼び出すと、シェルは終了します。

ダイアログ/ホイップテールを介してインポートスクリプトを呼び出すと、シェルは終了します。

次のスクリプトがあります。

#!/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]を押すことです。

私はFedora 29を使用しており、Mac OSでもこの動作を見ることができます。ソーススクリプトでhiptail / dialogを使用するときに特に考慮する必要がありますか?

ベストアンサー1

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

ここで回避策は、スクリプトのソースコードを取得せずに通常どおり実行するか、関連するすべてのコマンドset -eに対して十分なエラーチェックを実行してreturn失敗することを確認することです。 (いいえexit、これはシェル全体が終了し、returnソーススクリプトから返されるためです。)

おすすめ記事