4

引数を指定しないtrapと、すべてのトラップに対して現在設定されているコマンドが出力されます。ただし、サブシェルはトラップを継承しないため、トラップを保存および復元する標準的な例は bash で失敗します。

save_traps=$(トラップ)
...
eval "$save_traps"

割り当ての RHS のトラップはサブシェルで実行されるため、save_traps は常に空の文字列です。の出力を一時ファイルに書き込む以外trapに、トラップに設定されている現在のコマンドをスクリプトで見つけるにはどうすればよいでしょうか?

4

2 に答える 2

4

私のために働きます。

サンプル トラップを作成します。

$ trap
$ trap echo SIGIO
$ trap
trap -- 'echo' SIGIO

トラップを次の場所に保存しsave_trapsます。

$ save_traps=$(trap)

削除する:

$ trap SIGIO
$ trap | wc -l
   0

戻す:

$ eval "$save_traps"
$ trap
trap -- 'echo' SIGIO

テスト済み:

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
于 2012-10-04T20:45:23.650 に答える
1

Bash のマンページには、トラップはサブシェルでリセットされ、コマンド置換はサブシェルで実行されると書かれているようですが、trap内部で実行して$()も機能します (Bash 3.2 および 4.2 でテスト済み)。動作するはずの POSIX でも言及されていtraps=$(trap)ます。

pgasin #bashat に感謝しirc.freenode.netます。

于 2012-03-15T14:55:32.990 に答える