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

如何通过shell脚本导出变量?,shell,ubuntu,Shell,Ubuntu,a、 嘘 我们可以在命令行中执行source./a。但是我需要通过shell脚本进行导出 b、 嘘 没有错误。。。但是命令行中的$x将不显示任何内容。所以它没有得到出口 你知道怎么做吗 a、 嘘 #/垃圾箱/垃圾箱 导出x=/usr/local ----------- admin@client:/a.sh admin@client:echo$x admin@client: 您不能通过shell脚本进行导出,因为shell脚本在子shell进程中运行,并且只有子shell的子shell将继承

a、 嘘

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

b、 嘘

没有错误。。。但是命令行中的
$x
将不显示任何内容。所以它没有得到出口

你知道怎么做吗


a、 嘘

#/垃圾箱/垃圾箱
导出x=/usr/local
-----------
admin@client:/a.sh
admin@client:echo$x
admin@client:  

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

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

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

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

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

admin@client:  <insert ....>
然后让当前shell执行该输出

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

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

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

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

我希望这会有所帮助。

另一种方法是将脚本放入~/bin,并确保~/bin在您的路径中。然后可以全局访问变量。这只是我用来编译Go源代码的一个示例,它需要GOPATH变量指向当前目录(假设您位于编译源代码所需的目录中):

从~/bin/GOPATH:

source a.sh
那么你只要做:

#!/bin/bash

echo declare -x GOPATH=$(pwd) 

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

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

#> $(GOPATH)
并另存为,例如~/Desktop/TEST\u导出

最后,
$chmod+x~/Desktop/TEST\u导出

--

之后,使用
source~/Desktop/TEST\u导出bob运行它

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

script1.sh

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

它对在同一父shell中运行的脚本保持不变,并防止冲突。

感谢您让我知道,请标记。键入ctrl-D,然后返回以完成使用catThanks创建的文件的编写。我更新了我的帖子。我试过了,但当我打印出来时,jsut给了我一条空行。什么都没发生?我不确定你到底做了什么,但那不是我做的。请注意shell脚本执行过程中出现的反勾号,该脚本响应的是导出命令,而不是自己执行的命令。是的,但我不确定它是否有用。相关:此答案应该有一个勾号此答案应该有一个勾号+1继续训练。这应该是正确的答案;)需要一个社区来获得被接受的答案heheCan’在我的头撞桌子超过4小时后,我不能告诉你我有多高兴找到这个答案。。。。现在我终于可以清除血液,在额头上贴上创可贴了哈哈哈
#!/bin/bash

echo declare -x GOPATH=$(pwd) 
#> $(GOPATH)
#!/bin/bash
export TEST_EXPORT=$1
export TEST_EXPORT_2=$1_2
export TEST_EXPORT_TWICE=$1_$1
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}"
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