スクリプト自体内のシェルスクリプトのサブシェル番号を識別します。

スクリプト自体内のシェルスクリプトのサブシェル番号を識別します。

誤ってスクリプト自体からサブシェル番号(BASH_SUBSHELL)を公開したかったのですが、サブシェル0が出ました。

これはスクリプトの行です

echo "Operated from subshell: $BASH_SUBSHELL

端末のシェル出力の一部

  • echo 'サブシェルでの作業:0'サブシェルでの作業:0

質問スクリプト自体が実行されているサブシェルを表示できますか?

答え1

スクリプトがサブシェルで実行されないため、この出力は正確です。サブシェルは、括弧( ... )、コンテキスト、&およびコマンドの置換など、いくつかの方法で生成されますが、$( ... )スクリプトの起動では生成されません。これにより、スクリプトを実行するためのまったく新しいシェルが作成されます。

あなたが考えることができるものSHLVL変数、どちらするスクリプト(およびシェル)レベルあたりの増分:

SHLVL新しい Bash インスタンスが起動されるたびに 1 ずつ増加します。これは、Bashシェルの入れ子の深さを計算するために使用されます。

スクリプト行が次のような場合

echo "Operated from shell level: $SHLVL"

そうすれば、期待した結果が得られます。スクリプトが再帰的になると、$SHLVL毎回増加します。

答え2

実際、いくつかのサブ地獄を使用するコードは次のとおりです。

echo "main shell: $BASH_SUBSHELL"
( 
    echo "first subshell: $BASH_SUBSHELL"
    ( 
        echo "second subshell: $BASH_SUBSHELL"
        (
            echo "third subshell: $BASH_SUBSHELL"
        )
    )
)

関連情報