1

Env 変数を定義しました: export NBR_PROCESS=2

基本的には変数を更新できるはずですが、次のスクリプトを実行すると、実行するたびに同じ結果が得られます。

#!/bin/bash
echo "Script 2: Before decrement : $NBR_PROCESS"
export NBR_PROCESS=$(($NBR_PROCESS - 1))
echo "Script 2: After decrement : $NBR_PROCESS"

実行ごとに、次の同じ結果が得られます。

Script 2: Before decrement : 2
Script 2: After decrement : 1

私がやりたいことは、スクリプトを実行して変数 NBR_PROCESS をデクリメントすることです。

ここで見逃したものはありますか?ありがとうございました !

4

3 に答える 3

5

「ソース」する必要があります

ソースyour_script


EDIT 1この回答
を参照してください...


編集2

. filename [arguments] また source filename [arguments]

完全な説明:

現在のシェル コンテキストで filename 引数からコマンドを読み取り、実行します。filename にスラッシュが含まれていない場合、PATH 変数を使用して filename を検索します。Bash が POSIX モードでない場合、ファイル名が $PATH に見つからない場合、現在のディレクトリが検索されます。引数が指定されている場合、それらは filename が実行されたときに位置パラメーターになります。それ以外の場合、位置パラメーターは変更されません。戻りステータスは、最後に実行されたコマンドの終了ステータス、またはコマンドが実行されていない場合はゼロです。filename が見つからないか読み取れない場合、返されるステータスはゼロ以外です。このビルトインは source と同等です。

于 2012-08-27T16:25:30.080 に答える
3

スクリプト (または任意の実行可能ファイル) は、別の (子) プロセスで実行されているため、シェルの環境変数を変更できません。シェル内の環境を変更する唯一の方法は、exportビルトインを使用することです。envコマンドを使用して、次のようなプログラムの環境をセットアップすることもできますenv YOURVAR=1 yourprogram yourarguments...

bash 関数またはevalまたはsourceビルトインを使用できます (ビルトインを間接的に呼び出すためexport)。

高度な bash スクリプト ガイドを読む

于 2012-08-27T16:25:06.730 に答える
2

スクリプトを実行するたびに、環境変数 (または実行されているユーザー) の新しいコピーが取得され、そのプロセスに対してローカルのままになります。つまり、変更された変数は、そのインスタンスに対してのみ変更されます。

プロセスが子プロセスを作成する場合も同じです。子は親の環境のコピーを受け取り、それらが行った変更は終了時に「消えます」。

Luc M が述べたようsourceに、スクリプトを Tlc プロセスとして実行するために使用できます。これにより、上記のスクリプトの内容が環境にも影響を与えることができます。

于 2012-08-27T16:25:16.327 に答える