web-dev-qa-db-ja.com

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

Bashスクリプトでグローバル環境変数を設定する方法は?

もし私が

#!/bin/bash
FOO=bar

...または

#!/bin/bash
export FOO=bar

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

79
Alex

.を使用してスクリプトを実行します

. myscript.sh

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

exportは、新しい変数がどの変数を使用できるかを管理します。

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

$BARrunScript.shの環境で使用できますが、$FOOは使用できません。

134
mob

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

. ./setfoo.sh

これは、subシェルとしてではなく、currentシェルのコンテキストで実行します。

Bashのmanページから:

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

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

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

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

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

引数が指定されている場合、ファイル名が実行されると、それらは位置パラメータになります。

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

51
paxdiablo

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
8
CDT
#!/bin/bash
export FOO=bar

または

#!/bin/bash
FOO=bar
export FOO

man export:

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

4