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
$BASHPID
Bashでは比較できます$$
$ ( 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この方法の場合。