Bashで私がサブシェルにあるかどうかをどのように検出しますか?

Bashで私がサブシェルにあるかどうかをどのように検出しますか?

exit端末のシャットダウンを防ぐために、組み込み関数の機能を置き換える関数を作成しようとしています。

環境変数を試してみましたSHLVLが、サブシェルでは変更されていないようです。

$ echo $SHLVL
1
$ ( echo $SHLVL )
1
$ bash -c 'echo $SHLVL'
2

私の機能は次のとおりです。

exit () {
    if [[ $SHLVL -eq 1 ]]; then
        printf '%s\n' "Nice try!" >&2
    else
        command exit
    fi
}

exitただし、この方法ではサブシェルでは使用できません。

$ exit
Nice try!
$ (exit)
Nice try!

私がサブシェルにいるかどうかを検出する良い方法はありますか?

ベストアンサー1

$BASHPIDBashでは比較できます$$

$ ( if [ "$$" -eq "$BASHPID" ]; then echo not subshell; else echo subshell; fi )
subshell
$   if [ "$$" -eq "$BASHPID" ]; then echo not subshell; else echo subshell; fi
not subshell

Bashを使用しない場合は、$$サブシェルで変更されていないままにする必要があるため、実際のプロセスIDを取得するには別の方法が必要です。

実際のpidを取得する1つの方法はsh -c 'echo $PPID'。ただ普通の場所に置いておくと、( … )シェルはすでにフォークに最適化されており、機能しないように見えることがあります。追加のno-opコマンドを試して、( : ; sh -c 'echo $PPID'; : )サブシェルが最適化するには複雑すぎると思います。信用は行くスタックオーバーフローのJohn1024この方法の場合。

おすすめ記事