24

#! /bin/sh
export x=/usr/local

source ./aコマンドラインで実行できます。しかし、シェルスクリプトを介してエクスポートを行う必要があります。

b.sh

#! /bin/sh
. ~/a.sh

エラーはありません...しかし$x、コマンドラインでは何も表示されません。そのため輸出には至りませんでした。

それを機能させる方法はありますか?


#! /bin/sh
export x=/usr/local
-----------
admin@client: ./a.sh
admin@client: echo $x

admin@client:  <insert ....>
4

6 に答える 6

100

export ステートメントをシェル スクリプトに入れ、'source' コマンドを使用して現在のプロセスで実行できます

source a.sh

これが役立つことを願っています。

于 2013-11-13T18:37:54.387 に答える
27

シェル スクリプトは子シェル プロセスで実行され、子シェルの子のみがエクスポートを継承するため、シェル スクリプトを介してエクスポートを実行することはできません。

source を使用する理由は、現在のシェルにコマンドを実行させるためです

起動時に bash が source する .bashrc などのファイル (または他のシェルの同様のファイル) に export コマンドを配置することは非常に一般的です。

もう 1 つのアイデアは、エクスポート コマンドを出力として生成するシェル スクリプトを作成することです。

shell$ cat > script.sh
#!/bin/sh
echo export foo=bar
^D
chmod u+x script.sh

そして、現在のシェルにその出力を実行させます

shell$ `./script.sh`

shell$ echo $foo
bar

shell$ /bin/sh
$ echo $foo
bar

(スクリプトの呼び出しは、シェルにスクリプトの出力を実行させるために、バッククォートで囲まれていることに注意してください)

于 2012-06-18T02:37:00.807 に答える
3

変数を環境にエクスポートすると、その変数が子プロセスから見えるようになるだけです。子が親の環境を変更する方法はありません。

于 2012-06-18T02:37:22.913 に答える
1

(上記のアイデアを盗む/説明する)別の方法は、スクリプトを ~/bin に配置し、~/bin が PATH にあることを確認することです。その後、変数にグローバルにアクセスできます。これは、現在のディレクトリを指す GOPATH 変数を必要とする Go ソース コードをコンパイルするために使用する単なる例です (ソース コードをコンパイルする必要があるディレクトリにいると仮定します)。

~/bin/GOPATH から:

#!/bin/bash

echo declare -x GOPATH=$(pwd) 

次に、次のようにします。

#> $(GOPATH)

したがって、$(pwd) のおかげで、この変数を自動的に呼び出してオンザフライで宣言できるカスタム ビルド スクリプトなど、他のスクリプト内からも $(GOPATH) を使用できるようになりました。

于 2013-11-25T03:30:20.270 に答える
0

script1.sh

shell_ppid=$PPID
shell_epoch=$(grep se.exec_start "/proc/${shell_ppid}/sched" | sed 's/[[:space:]]//g' | cut -f2 -d: | cut -f1 -d.)
now_epoch=$(($(date +%s%N)/1000000))
shell_start=$(( (now_epoch - shell_epoch)/1000 ))
env_md5=$(md5sum <<<"${shell_ppid}-${shell_start}"| sed 's/[[:space:]]//g' | cut -f1 -d-)
tmp_dir="/tmp/ToD-env-${env_md5}"
mkdir -p "${tmp_dir}"
ENV_PROPS="${tmp_dir}/.env"
echo "FOO=BAR" > "${ENV_PROPS}"

script2.sh

shell_ppid=$PPID
shell_epoch=$(grep se.exec_start "/proc/${shell_ppid}/sched" | sed 's/[[:space:]]//g' | cut -f2 -d: | cut -f1 -d.)
now_epoch=$(($(date +%s%N)/1000000))
shell_start=$(( (now_epoch - shell_epoch)/1000 ))
env_md5=$(md5sum <<<"${shell_ppid}-${shell_start}"| sed 's/[[:space:]]//g' | cut -f1 -d-)
tmp_dir="/tmp/ToD-env-${env_md5}"
mkdir -p "${tmp_dir}"
ENV_PROPS="${tmp_dir}/.env"
source "${ENV_PROPS}"
echo $FOO
./script1.sh
./script2.sh
BAR

同じ親シェルで実行されるスクリプトに対して持続し、衝突を防ぎます。

于 2020-11-02T14:56:06.407 に答える