bashスクリプトを連結(つまり順次実行)し、これらのbashスクリプトに環境変数を設定します。

bashスクリプトを連結(つまり順次実行)し、これらのbashスクリプトに環境変数を設定します。

hadnodes.confファイルがあります(AWS仮想マシンのノードIPアドレスの設定)。

> ls -lista hadnodes.conf

7733498 4 -rwxrwxrwx. 1 pol pol 141 Feb 20 08:05 hadnodes.conf

コンテンツ(実際のIPではない):

> more hadnodes.conf 

#!/bin/bash
export NAME_NODE=18.202.25.99
export DATA_NODE_1=52.30.117.99
export DATA_NODE_2=34.248.153.99
export DATA_NODE_3=52.17.111.99

他のスクリプトファイルsetnodes

> ls -lista setnodes 

7733504 4 -rwxrwxr-x. 1 pol pol 92 Feb 20 09:59 setnodes

コンテンツ:

> more setnodes 
#!/bin/bash
source /home/pol/dcu/ca675_cloud_technologies/assignment_1/nodes/hadnodes.conf

これで、入力するとsetnodeが機能するようになります。

source /path/to/setnodes

しかし、私が走ればそうではありません。

. /path/to/setnodes

説明どおりここそしてここ

ただし、実行可能スクリプトで> setnodesを実行すると、変数は許可されません。つまり、$NAME_NODE、DATA_NODE_1、および c は定義されていません。そのディレクトリを $PATH に入れたのですが、タブの完成が起きてスクリプトが見えないわけではありません。 ""> which setnodes"コマンドを使用しても正しいディレクトリに表示されます。

また、hadnodes.confスクリプトを実行するためにsetnodesで "exec"を使用してみました(言及どおり)。ここ)しかし役に立たない。

私は、スクリプト「N」の環境変数がチェーンを介して呼び出しシェル/環境(スクリプト0)に渡されるように、bashスクリプトを「チェーン」(順番に実行)するという点で、私が欠けているものがあるかどうか疑問に思います。

答え1

私は、スクリプト「N」の環境変数がチェーンを介して呼び出しシェル/環境(スクリプト0)に渡されるように、bashスクリプトを「チェーン」(順番に実行)するという点で、私が欠けているものがあるかどうか疑問に思います。

あなたはこれができないという事実を無視しています。 「環境」というものはなく、むしろ各プロセスには独自の環境があります。技術的に言えば、環境は、親プロセスから子プロセスにexec*()(または実行されたプログラムを呼び出すプログラムから)渡される一連の文字列です。プログラム自体のサポートがなければ、環境変数を「上に」渡したり、実行中のプログラムの環境を変更したりする方法はありません。

.またはを使用してスクリプトをインポートすることは、source実際には別のプロセスでスクリプトを実行するのではなく、シェル自体を呼び出して外部スクリプトが実行されているのと同じコンテキストでスクリプトを読み取って処理することです。

だからスクリプトがあればa.sh

export FOO=abcd

その後、実行は「親」シェル環境に変数を設定します. a.shFOOしかし、./a.shいつものように走ることは起こらずに起こることもできません。


変数の割り当てを「上向き」に渡す1つの方法は、これを設定するためのシェルコマンドを出力してから「親」シェルevalで実行することです。それがすべてですssh-agent。シェルの実装は次のとおりです( b.sh)。

#!/bin/sh
# do something else here, but don't produce output
echo 'export FOO=abcd'

これで実行すると、親シェルは代替コマンドから受け取ったコマンドを実行しますeval "$(./b.sh)"export FOO=abcd

ただし、サブルーチンがシェルスクリプトの場合は、上記のように取得する方が簡単です。


もちろん、チェーン接続について話すときは、あるシェルで変数を設定し、別のシェルを呼び出して3番目のシェルを呼び出すこともできます。

$ cat c1.sh
#!/bin/sh
export BAR=abcd
./c2.sh
$ cat c2.sh
#!/bin/sh
echo "$BAR"

今、runはrunをc1.sh実行し、の値はからに「下向き」継承されるため、c2.shを出力します。abcdBARc1.shc2.sh

関連情報