コマンドを実行したときにサブシェルを作成しませんでしたか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
サブシェル環境でのコマンドの置換、角かっこグループのコマンド、および非同期コマンドの呼び出しこれはシェル環境のコピーです。ただし、シェルに捕捉されたトラップは、呼び出し時に親からシェルに継承された値にリセットされます。パイプラインの一部として呼び出される組み込みコマンドは、サブシェル環境でも実行されます。サブシェル環境への変更は、シェルの実行環境には影響しません。
したがって、サブシェル環境は、エクスポートされた変数だけでなく、すべての変数を含む親シェルとほぼ同じコピーです。
答え2
コマンド実行環境部バッシュマニュアル:
組み込み関数やシェル関数ではなく単純なコマンドを実行したい場合は、次のように構成された別の実行環境で呼び出されます。特に明記しない限り、これらの値はシェルから継承されます。
- シェル変数と関数輸出用としてマーク、コマンド用にエクスポートされた変数は環境に渡されます。
したがって:
bash
組み込み関数やシェル関数ではなく、サブシェルで実行されます。親シェルからエクスポート用にマークされた変数を継承します。
実験が示すように、
value
サブシェルbash
は 。
これはbash
、あなたが得るシェルがサブシェルであることを意味するのではなく、サブシェルで実行され、それを置き換えたことを意味します。したがって、関連するサブシェルは一時的であり、仲介者だけです。
下の図を参照してください。
チャートの場合直径
と入力すると、bash
現在のシェルが分岐して同じシェルが作成されます。黄色い兄妹はオレンジのexec
兄妹を待つbash
。これは、すべての環境変数が継承されるのではなく、組み込みのコマンド(zsh
、、、g++
...)でも発生します。ただし、環境変数の1つではなくエクスポートされないため、blue Bashはそれを選択しません。firefox
bash
value
源泉: