次のスクリプトがあります。
#!/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 OSでもこの動作を見ることができます。ソーススクリプトでhiptail / dialogを使用するときに特に考慮する必要がありますか?
答え1
スクリプトはerrexit
フラグを設定するために使用されますset -e
。それを取得した後、未確認の失敗したコマンドがシェルを終了します。プログラム可能な完了スクリプトを使用している場合は、一部のコマンドが失敗したコマンドを実行する可能性があります。これは、タブ補完がそれをトリガーする理由を説明できます。
ここで回避策は、スクリプトのソースコードを取得せずに通常どおり実行するか、関連するすべてのコマンドset -e
に対して十分なエラーチェックを実行してreturn
失敗することを確認することです。 (いいえexit
、これはシェル全体が終了し、return
ソーススクリプトから返されるためです。)