24

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

我们可以source ./a在命令行中进行。但我需要通过 shell 脚本进行导出。

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

您可以将导出语句放在 shell 脚本中,然后使用“源”命令在当前进程中执行它

source a.sh

我希望这有帮助。

于 2013-11-13T18:37:54.387 回答
27

您不能通过 shell 脚本进行导出,因为 shell 脚本在子 shell 进程中运行,并且只有子 shell 的子进程会继承导出。

使用 source 的原因是让当前的 shell 执行命令

将导出命令放在诸如 .bashrc 之类的文件中是很常见的,bash 将在启动时获取该文件(或其他 shell 的类似文件)

另一个想法是,您可以创建一个 shell 脚本,该脚本在输出时生成一个导出命令:

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

然后让当前 shell 执行该输出

shell$ `./script.sh`

shell$ echo $foo
bar

shell$ /bin/sh
$ echo $foo
bar

(请注意,脚本的调用被反引号包围,以使 shell执行脚本的输出)

于 2012-06-18T02:37:00.807 回答
6

在这里回答我自己的问题,使用上面的答案:如果我有多个相关变量要导出,它们使用与每个导出的一部分相同的值,我可以这样做:

#!/bin/bash
export TEST_EXPORT=$1
export TEST_EXPORT_2=$1_2
export TEST_EXPORT_TWICE=$1_$1

并保存为例如 ~/Desktop/TEST_EXPORTING

最后$chmod +x ~/Desktop/TEST_EXPORTING

--

之后,运行它source ~/Desktop/TEST_EXPORTING bob

然后检查export | grep bob应该显示您的期望。

于 2018-09-30T09:28:53.433 回答
3

将变量导出到环境中只会使该变量对子进程可见。孩子无法修改其父母的环境。

于 2012-06-18T02:37:22.913 回答
1

您可以这样做的另一种方法(窃取/解释上述想法)是将脚本放入 ~/bin 并确保 ~/bin 在您的 PATH 中。然后您可以全局访问您的变量。这只是我用来编译我的 Go 源代码的一个示例,它需要 GOPATH 变量指向当前目录(假设您在需要从中编译源代码的目录中):

从 ~/bin/GOPATH:

#!/bin/bash

echo declare -x GOPATH=$(pwd) 

然后,您只需执行以下操作:

#> $(GOPATH)

因此,您现在也可以在其他脚本中使用 $(GOPATH),例如自定义构建脚本,它可以自动调用此变量并通过 $(pwd) 动态声明它。

于 2013-11-25T03:30:20.270 回答
0

脚本1.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}"

脚本2.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

对于在同一个父 shell 中运行的脚本,它仍然存在,并且可以防止冲突。

于 2020-11-02T14:56:06.407 回答