標準サブシェルとコマンド置換サブシェル


8

これらのトラップ出力について説明してください:

$ line(){ echo -------------; echo $BASHPID; }
$ trap 'echo bye' EXIT; trap -p; line; (trap -p; line); echo "$(trap -p; line)"

trap -- 'echo bye' EXIT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6176
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6178
trap -- 'echo bye' EXIT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6180

コマンド置換サブシェルは、トラップの性質を継承したと主張するという点で異なる動作をするのはなぜですか?

回答:


2

面白い。これはBash固有の動作のようです。

私は他の3つのPOSIX互換シェル(zsh、dash、busybox)を試しましたecho "$(trap)"が、それらのすべてで同じ結果が得られました(trap)。サブシェルが実行され、サブシェルはEXITトラップを表示しません。

(これtrap -pはBashに固有のものであり、追加のパラメーターがなければ、パラメーターがない場合と同じことをtrap行います。)

Bashの動作は潜在的に有用です。これはa="$(trap)"、親シェルのトラップ設定をキャプチャーするように記述できることを意味します。

ただし、サブシェルでトラップを設定またはクリアすると、親のトラップではなくサブシェルのトラップリストされます。

$ trap 'echo bye' EXIT
$ echo "$(trap TERM; trap)"  # explicitly clear TERM, but leave EXIT alone
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU

したがって、サブシェルのトラップに興味があるというまれなケースについても説明しました。

一般に、Bash開発者はサブシェルの処理を適切に機能させるために特別な努力を払っているようです。また、最小限のPOSIXシェルを使用するよりも、Bashを使用してバックグラウンドサブプロセスを管理する方がはるかに簡単です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.