ubuntu 如何通过shell脚本导出变量?

yws3nbqq  于 2022-12-26  发布在  Shell
关注(0)|答案(6)|浏览(182)

a.sh

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

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

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

没有错误...但是命令行中的$x什么也不显示。所以它没有被导出。
有办法让它工作吗?
a.sh

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

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

xzv2uavs1#

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

source a.sh
bttbmeg0

bttbmeg02#

不能通过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

(note在其上方,脚本的调用用反勾号包围,以使shell * 执行 * 脚本的输出)

628mspwn

628mspwn3#

用上面的答案回答我自己的问题:如果我有多个相关变量要导出,并且每个导出都使用相同的值,我可以这样做:

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

并另存为,例如~/桌面/测试导出
最后是$chmod +x ~/Desktop/TEST_EXPORTING

然后,使用source ~/Desktop/TEST_EXPORTING bob运行它
然后使用export | grep bob进行检查,应该会显示您所期望的内容。

2j4z5cfb

2j4z5cfb4#

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

6pp0gazn

6pp0gazn5#

另一种方法(借用/详细说明上面的想法)是将脚本放在~/bin中,并确保~/bin在PATH中,然后就可以全局访问变量了,这只是我编译Go语言源代码时使用的一个例子,它需要GOPATH变量指向当前目录(假设你位于要编译源代码的目录中):
来自~/bin/GOPATH:

#!/bin/bash

echo declare -x GOPATH=$(pwd)

那你就这么做

#> $(GOPATH)

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

polhcujo

polhcujo6#

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
x一个一个一个一个x一个一个二个x
对于在同一个父shell中运行的脚本,它将持续存在,并防止冲突。

相关问题