7

維持するはずのbashスクリプトを理解しようとしていて、行き詰まりました。コマンドの形式は次のとおりです。

. $APP_LOCATION/somescript.sh param1 param2 &

この行はループで呼び出されていません。また、somescript.sh から呼び出し元のスクリプトに返されるリターン コードもありません。

私は「。」であることを知っています。プロセスを同じシェルで実行します。ただし、「&」は別のプロセスを生成します。

それは矛盾しているように聞こえます。ここで実際に何が起こっているのですか?何か案は?

4

2 に答える 2

6

スクリプトはバックグラウンド プロセスで実行されていますが、これはサブシェルであり、ドットがない場合のように個別に呼び出されるインタープリターではありません。

つまり、現在のインタープリターは fork し、コマンドの実行を開始します (スクリプトのソース)。そのため、環境変数だけでなく、シェル変数も継承します。

そうしないと、新しいスクリプトのインタープリターが呼び出しによって呼び出されexecv()、現在のインタープリターが新しいものに置き換えられます。これは通常、柔軟性が向上するため、正しいことです。同じシェル用に書かれたスクリプト以外は.orで実行できますがsource、結局のところ、新しいインタープリターを開始すると、他のスクリプトを Python や Perl で書き直すことができます。 、コンパイルされたバイナリなど、呼び出し元を変更する必要はありません。

(これは、実行されることを意図したスクリプトが、ソースを使用することを意図したライブラリとは対照的に、ファイル名拡張子を付けてはならない理由の一部です。また、不正確な情報が提供されないように、bashライブラリをどのような種類のインタープリターにソースを提供できるか)。.bash.sh

于 2013-08-28T11:50:05.670 に答える