標準入力オプションを使用してBashのトラップ操作を変更できますか?

標準入力オプションを使用してBashのトラップ操作を変更できますか?

オプションを使用して、スクリプトが終了またはクラッシュしたときに発生する状況を変更したいと思います。たとえば、ログと一時ファイルがきれいに終了しない場合は、クリーンアップしません。

トラップの動作内で関数を呼び出すことができることを知っています。ただし、これは通常、スクリプトのプログラム/ガイドラインを入力する前に処理する必要があるためです。後で評価する変数を使用する必要があります。

私が理解したところ、関数のようなものはメモリにロードされ、スクリプト自体を読み直すまで再読み込みされません。

動作しますか?- そうでない場合 -それを行う方法はありますか?ありがとうございます。

答え1

あなたの質問を正しく理解したら、変更されていないシェルスクリプトに動作を「注入」したいと思います。

bashのマニュアルページを確認し、BASH_ENV実際のスクリプトの前に実行されるで参照するファイルを見つけます。既存のスクリプトの実行時に実行する操作に応じて、この方法で動作を調整できます。

この例では、BASH_ENVスクリプトと実際のスクリプトを生成します。ご覧のとおり、trapのコードはBASH_ENV実行する内容を設定します。

set -ex
read td < <(mktemp --directory --tmpdir=/dev/shm .XXX)
trap "rm -rf ${td}" EXIT
t_BASH_ENV="${td}/BASH_ENV"
t_BASH_SCRIPT="${td}/BASH_SCRIPT"
cat > ${t_BASH_ENV} <<'_EOF_'
: t_BASH_ENV $PPID $$
trap ": trapped t_BASH_ENV $PPID $$" EXIT
_EOF_
cat > ${t_BASH_SCRIPT} <<'_EOF_'
: t_BASH_SCRIPT $PPID $$
_EOF_
env -i BASH_ENV=${t_BASH_ENV} bash -x "${t_BASH_SCRIPT}"

出力:

+ read td
++ mktemp --directory --tmpdir=/dev/shm .XXX
+ trap 'rm -rf /dev/shm/.vJp' EXIT
+ t_BASH_ENV=/dev/shm/.vJp/BASH_ENV
+ t_BASH_SCRIPT=/dev/shm/.vJp/BASH_SCRIPT
+ cat
+ cat
+ env -i BASH_ENV=/dev/shm/.vJp/BASH_ENV bash -x /dev/shm/.vJp/BASH_SCRIPT
+ : t_BASH_ENV 4438 4443
+ trap ': trapped t_BASH_ENV 4438 4443' EXIT
+ : t_BASH_SCRIPT 4438 4443
+ : trapped t_BASH_ENV 4438 4443
+ rm -rf /dev/shm/.vJp

HTH。

関連情報