シェルスクリプトのグローバル環境変数


83

bashスクリプトでグローバル環境変数を設定するにはどうすればよいですか?

私が次のようなことをするなら

#!/bin/bash
FOO=bar

...または

#!/bin/bash
export FOO=bar

... varsはローカルコンテキストにとどまっているようですが、スクリプトの実行が終了した後もvarsを使い続けたいと思います。

回答:


141

でスクリプトを実行する .

. myscript.sh

これにより、現在のシェル環境でスクリプトが実行されます。

export 新しいプロセスで使用できる変数を管理します。

FOO=1
export BAR=2
./runScript.sh

その後$BAR、の環境で利用可能になりますがrunScript.sh、利用でき$FOOません。


27
その最初のものに注意してください。スラッシュがないと、パスに表示されます。「」のようなものを使用してください。./myscript.sh '特定のものを確実に実行したい場合。
paxdiablo 2009

13
sourceのエイリアスです.。したがってsource myscript.sh、より明確にしたい場合は、代わりに実行できます。
Ehtesh Choudhury 2013

ドットとスペースを使用してスクリプトを実行するとどうなるのでしょうか。例。MyScript
cNgamba

54

シェルスクリプトを実行すると、サブシェルで実行されるため、親シェルの環境に影響を与えることはありません。次の手順でスクリプトを入手します。

. ./setfoo.sh

これは、の文脈でそれを実行し、現在のないように、シェルサブシェル。

bashのmanページから:

。ファイル名[引数]
ソースファイル名[引数]

現在のシェル環境でfilenameからコマンドを読み取って実行し、filenameから最後に実行されたコマンドの終了ステータスを返します。

filenameにスラッシュが含まれていない場合、PATH内のファイル名を使用して、filenameを含むディレクトリが検索されます。

PATHで検索されるファイルは、実行可能である必要はありません。bashがPOSIXモードでない場合、PATHにファイルが見つからない場合は、現在のディレクトリが検索されます。

shopt組み込みコマンドのsourcepathオプションがオフになっている場合、PATHは検索されません。

引数を指定すると、ファイル名実行時の定位置パラメータになります。

それ以外の場合、位置パラメータは変更されません。戻りステータスは、スクリプト内で最後に終了したコマンドのステータス(コマンドが実行されていない場合は0)であり、ファイル名が見つからないか読み取れない場合はfalseです。


興味深い-私はその構文を見たことがありません。これはソース./setfoo.shと同等ですか?
ire_and_curses 2009

2
同じですが、入力が速くなります(古いシステムでは互換性が高くなります。kshにはソースコマンドはありませんが、「。」があります)。
paxdiablo 2009

9

source myscript.sh また、実行可能です。

Linuxコマンドの説明source

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context

たぶん、ここでもう少し詳しく説明します。何をするのかについての非常に簡単な説明はどうsourceですか?
フィリップクラウド

ターミナルに@PhillipCloudと入力man sourceすると、必要なものが得られます。
CDT 2013

5
私はに精通していsourceます。たぶんOPはそうではありません。
フィリップクラウド

2
@PhillipCloud私自身、もう少し詳しく知りたいのですが。答えを編集したい場合は、間違いなくそれを行うことができます。原因とそのすべてを助けてください... Thx!
ダンローゼンスターク2014

4
#!/bin/bash
export FOO=bar

または

#!/bin/bash
FOO=bar
export FOO

マニュアルエクスポート:

シェルは、指定された名前に対応する変数にexport属性を与えます。これにより、変数は、後で実行されるコマンドの環境に置かれます。変数の名前の後に= wordが続く場合、その変数の値はwordに設定されます。


シェルスクリプトのすべての初心者の方へ:envvar名、「=」文字、および値自体の間に空白がないことに注意してください。これは機能しません:export FOO = /mydir/bar
russellhoff 2017年

-3
FOO=bar
export FOO

2
これは機能せず、親プロセスの環境変数を設定しません。
dreamlax 2009

3
親プロセスのみが、親プロセスの環境変数を設定できます。
glenn jackman 2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.