57

最近、環境変数を設定するスクリプトを作成しました。見てみましょう。

#!/bin/bash

echo "Pass a path:"
read path
echo $path

defaultPath=/home/$(whoami)/Desktop

if [ -n "$path" ]; then
    export my_var=$path
else
    echo "Path is empty! Exporting default path ..."
    export my_var=$defaultPath
fi

echo "Exported path: $my_var"

それはうまく機能しますが、問題はmy_varローカルでのみ利用できることです。つまり、スクリプトを実行したコンソールウィンドウで利用できます。

どこにでも見られるグローバル環境変数をエクスポートできるスクリプトを作成するにはどうすればよいですか?

4

13 に答える 13

144

." "(ドットスペース)が前に付いたシェルスクリプトを実行するだけです。

これにより、スクリプトは元のシェルで命令を実行します。したがって、スクリプトが終了した後も変数は存在します

元:

cat setmyvar.sh
export myvar=exists

. ./setmyvar.sh

echo $myvar
exists
于 2014-05-29T15:22:05.613 に答える
51

すべてのシェルには独自の環境があります。すべてのコンソールウィンドウに魔法のように表示されるユニバーサル環境はありません。あるシェルで作成された環境変数は、別のシェルではアクセスできません。

それはさらに制限的です。1つのシェルがサブシェルを生成する場合、そのサブシェルは親の環境変数にアクセスできますが、そのサブシェルが環境変数を作成する場合、親シェルではアクセスできません。

すべてのシェルが同じ変数のセットにアクセスする必要がある場合は、それらを設定するスタートアップファイルを作成できます。これは、BASHで$HOME/.bash_profileファイルを介して(または存在しない$HOME/.profile場合はを介して)またはを介して行われます。他のシェルには、独自のスタートアップファイルのセットがあります。1つはログインに使用され、もう1つはログインなしで生成されたシェルに使用されます(bashと同様に、3つ目は非対話型シェルに使用されます)。使用されている起動スクリプトと実行される順序については、マンページを参照してください)。$HOME/.bash_profile$HOME/.bashrc

共有メモリを使ってみることができますが、プロセスの実行中にしか機能しないと思いますので、共有メモリを設定する方法を考えても、そのコマンドが終了するとすぐに消えてしまいます。(名前付きパイプを除いて、共有メモリを使用することはめったにありません)。そうしないと、あるシェルに環境変数を設定して、別のシェルに自動的に取得させる方法が実際にはありません。名前付きパイプを使用するか、その環境変数をファイルに書き込んで、他のシェルがそれを取得できるようにすることができます。

誰かが私の知らないうちに1つのシェルの環境を変更した場合に発生する可能性のある問題を想像してみてください。

于 2012-09-10T14:01:23.467 に答える
7

実際、私はこれを達成する方法を見つけました(私の場合、bashスクリプトを使用していくつかのセキュリティ資格情報を設定することでした)

スクリプト内から呼び出すだけbashで、生成されたシェルにエクスポート値が含まれるようになります

export API_USERNAME=abc
export API_PASSWORD=bbbb
bash

を使用してファイルを呼び出すと、~/.app-x-setup.shこれらの環境値が設定されたインタラクティブなシェルが得られます

于 2017-02-20T10:07:18.530 に答える
4

/home/$USER/.profileにある.profileに変数を追加する必要があります

Yoはこのコマンドでそれを行うことができます:

echo 'TEST="hi"' >> $HOME/.profile

または、たとえばemacsでファイルを編集します。この変数をすべてのユーザーに設定する場合は、/ etc / profile(root)を編集する必要があります。

于 2012-09-10T12:38:28.530 に答える
3

実際、UNIXにはグローバル環境はありません。

各プロセスには、元々親から継承された環境がありますが、最初の作成後はプロセスに対してローカルです。

デバッガーを使用してプロセスを掘り下げない限り、自分で変更することしかできません。

于 2012-09-10T12:33:23.340 に答える
3

David W.の回答の2番目の段落から、次のように抽出されました。「1つのシェルがサブシェルを生成する場合、そのサブシェルは親の環境変数にアクセスできますが、そのサブシェルが環境変数を作成する場合、親シェルではアクセスできません。 「」

ユーザーが親シェルに新しい環境変数へのアクセスを許可する必要がある場合は、親シェルで次のコマンドを発行するだけです。

source <your_subshell_script>

またはショートカットを使用する

. <your_subshell_script>
于 2014-11-05T23:59:07.527 に答える
3

一時ファイルに書き込んで、〜/.myglobalvarと言ってどこからでも読み取れるようにします

echo "$myglobal" > ~/.myglobalvar
于 2017-01-16T02:11:20.520 に答える
2

環境変数は、プロセスの実行に対して常に「ローカル」であり、exportコマンドを使用すると、サブプロセスの環境変数を設定できます。.bashrcを調べて、bashシェルの開始時に環境変数を設定できます。プロセスが別のプロセスの環境変数を変更(またはアクセス?)できないため、実行しようとしていることは不可能のようです。

于 2012-09-10T12:33:43.453 に答える
1

環境の初期化に使用される〜/ .bashrcまたは〜/.bash_profileファイルを更新できます。

于 2012-09-10T12:38:12.437 に答える
1

シェルのロード動作を見てください(マンページで説明されており、通常は.XXXshrcまたは.profileを参照しています)。一部の構成ファイルは、対話型シェルのログイン時にロードされ、一部はシェルを実行するたびにロードされます。後者に変数を配置すると、必要な動作が得られる可能性があります。たとえば、常にその個別のシェル(bashなど)を使用して変数を設定します。

于 2012-09-10T12:39:35.883 に答える
1

~/.bin/SOURCED/lazyシステムのフラットファイルとしてデータを保存およびロードするスクリプト。

[ ! -d ~/.megadata ] && mkdir ~/.megadata

function save_data {
[ -z "$1" -o -z "$2" ] && echo 'save_data [:id:] [:data:]' && return
local overwrite=${3-false}
[ "$overwrite" = 'true' ] && echo "$2" > ~/.megadata/$1 && return
[ ! -f ~/.megadata/$1 ]   && echo "$2" > ~/.megadata/$1 || echo ID TAKEN set third param to true to overwrite
}

save_data computer engine
cat ~/.megadata/computer
save_data computer engine
save_data computer megaengine true

function get_data {
[ -z "$1" -o -f $1 ] && echo 'get_data [:id:]' && return


[ -f ~/.megadata/$1 ]   && cat ~/.megadata/$1 || echo ID NOT FOUND
:
}

get_data computer
get_data computer
于 2013-06-29T03:11:09.260 に答える
1

シェルスクリプトで環境変数を動的に設定および参照する必要がある場合は、回避策があります。やりがいがあるかどうかは自分で判断してください。

この戦略には、環境変数を設定およびエクスポートするためのコードを含む「ロード」スクリプトを動的に書き込む「セット」スクリプトが含まれます。'load'スクリプトは、変数を参照する必要のある他のスクリプトによって定期的に実行されます。ところで、同じ戦略は、変数の代わりにファイルを読み書きすることによって行うことができます。

これが簡単な例です...

Set_Load_PROCESSING_SIGNAL.sh

#!/bin/bash
PROCESSING_SIGNAL_SCRIPT=./Load_PROCESSING_SIGNAL.sh
echo "#!/bin/bash" > $PROCESSING_SIGNAL_SCRIPT
echo "export PROCESSING_SIGNAL=$1" >> $PROCESSING_SIGNAL_SCRIPT
chmod ug+rwx $PROCESSING_SIGNAL_SCRIPT

Load_PROCESSING_SIGNAL.sh(これは上記の実行時に動的に作成されます)

#!/bin/bash
export PROCESSING_SIGNAL=1

Test_PROCESSING_SIGNAL.shでこれをテストできます

#!/bin/bash
PROCESSING_SIGNAL_SCRIPT=./Load_PROCESSING_SIGNAL.sh
N=1
LIM=100
while [ $N -le $LIM ]
do
# DO WHATEVER LOOP PROCESSING IS NEEDED
echo "N = $N"
sleep 5
N=$(( $N + 1 ))

# CHECK PROCESSING_SIGNAL
source $PROCESSING_SIGNAL_SCRIPT
if [[ $PROCESSING_SIGNAL -eq 0 ]]; then
# Write log info indicating that the signal to stop processing was detected
# Write out all relevent info
# Send an alert email of this too
# Then exit
echo "Detected PROCESSING_SIGNAL for all stop. Exiting..."
exit 1
fi
done
于 2013-10-04T14:35:32.687 に答える
0

少し話題から外れているかもしれませんが、スクリプトを実行するために一時的に設定する必要があり、ここで答えを探すことになりました。

実行後に保持する必要のない特定の環境変数を使用してスクリプトを実行する必要がある場合は、次のようにすることができます。

#!/usr/bin/env sh

export XDEBUG_SESSION=$(hostname);echo "running with xdebug: $XDEBUG_SESSION";$@

私の例では、ホスト名とともにXDEBUG_SESSIONを使用していますが、複数の変数を使用できます。それらをセミコロンで区切ってください。次のように実行します(スクリプトdebug.shを呼び出し、phpスクリプトと同じディレクトリに配置したと仮定します)。

$ debug.sh php yourscript.php
于 2021-05-28T18:41:36.613 に答える