「bash」コマンドを実行すると、サブシェルは生成されませんか? [コピー]

「bash」コマンドを実行すると、サブシェルは生成されませんか? [コピー]

コマンドを実行したときにサブシェルを作成しませんでしたかbash?たとえば、実行後はエクスポートbashされていない変数の値にアクセスできません。それでは、bashコマンドを使用して切り替えた環境は、現在bashシェルで実行されているサブシェルではありませんか?

:~$ value="testing"
:~$ echo $value
testing
:~$ bash
:~$ ps f
  PID TTY      STAT   TIME COMMAND
   82 tty1     S      0:00 -bash
   97 tty1     S      0:00  \_ bash
  124 tty1     R      0:00     \_ ps f
:~$
:~$ echo $value
:~$ exit
exit
:~$ export value
:~$ bash
:~$ echo $value
testing
:~$

ベストアンサー1

いいえ、これはサブシェルではありません。 Bashのサブシェルはこの変数で表されますBASH_SUBSHELL。各サブシェルレベルに対して値が1ずつ増加します。

$ echo $BASH_SUBSHELL 
0
$ ( echo $BASH_SUBSHELL )
1
$ ( ( echo $BASH_SUBSHELL ) )
2
$ ( ( ( echo $BASH_SUBSHELL ) ) )
3
$ ( ( ( ( echo $BASH_SUBSHELL ) ) ) )
4
$ ( ( ( ( ( echo $BASH_SUBSHELL ) ) ) ) )
5

ただし、別のシェルを起動すると、この変数は変更されません。

$ echo $BASH_SUBSHELL 
0
$ bash
$ echo $BASH_SUBSHELL 
0

新しいbashシェルを実行すると、まったく新しいインスタンスになるからです。はい、エクスポートされた変数は継承されます。子供もともとbashインスタンスのシェルですが、上記のように実際にはそのインスタンスのサブシェルではありません。サブシェルはエクスポートされた変数だけでなく、すべての変数を継承します。

$ foo=var
$ ( echo $BASH_SUBSHELL; echo $foo )
1
var
$ bash
$ echo $var ## <-- prints an empty line

これは(強調)COMMAND EXECUTION ENVIRONMENTでも説明されています。man bash

サブシェル環境でのコマンドの置換、角かっこグループのコマンド、および非同期コマンドの呼び出しこれはシェル環境のコピーです。ただし、シェルに捕捉されたトラップは、呼び出し時に親からシェルに継承された値にリセットされます。パイプラインの一部として呼び出される組み込みコマンドは、サブシェル環境でも実行されます。サブシェル環境への変更は、シェルの実行環境には影響しません。

したがって、サブシェル環境は、エクスポートされた変数だけでなく、すべての変数を含む親シェルとほぼ同じコピーです。

おすすめ記事