私は次のようなシェルスクリプトを書きましたtestmain.sh
。
username="ravi"
echo "The main ProcessId: "
echo $$
exec ./process.sh
そしてprocess.sh
:
echo "In subprocess the process ID is:"
echo $$
echo $username
で実行しています./testmain.sh
。
メインプロセス()とサブプロセス()が同じプロセスIDを共有するため、「ravi」を$username
印刷する必要があると予想しました。しかし。process.sh
testmain.sh
process.sh
process.sh
シェルはなぜこのように動作しますか?私は何が間違っていましたか?
答え1
exec
外部コマンド(dコマンドを含む)の環境に変数を渡すには、変数をエクスポートする必要があります。それ以外の場合は、source
スクリプトを読む必要があります。
したがって、次のいずれかを実行します。
export username="ravi"
echo "The main ProcessId: "
echo $$
exec ./process.sh
または:
username="ravi"
echo "The main ProcessId: "
echo $$
. ./process.sh # source the script
exec
これは、環境変数が継承されている間(通常はコマンドを実行するときと同じように)、エクスポートされていない変数が環境に追加されないためです。