假设我有这个脚本
export.bash:
#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
当我执行脚本并尝试访问时$VAR
,我没有任何价值!
echo $VAR
是否可以$VAR
通过执行export.bash而不进行采购来访问它?
source
或eval
或...)
man source
因为source
bash内置了该内容,将无法正常工作,您需要运行help source
假设我有这个脚本
export.bash:
#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
当我执行脚本并尝试访问时$VAR
,我没有任何价值!
echo $VAR
是否可以$VAR
通过执行export.bash而不进行采购来访问它?
source
或eval
或...)
man source
因为source
bash内置了该内容,将无法正常工作,您需要运行help source
Answers:
有什么方法可以
$VAR
通过执行export.bash
而无需采购它来进行访问?
快速回答:不可以。
但是,有几种可能的解决方法。
您已经提到的最明显的一个是在调用shell的上下文中使用source
或.
执行脚本:
$ cat set-vars1.sh
export FOO=BAR
$ . set-vars1.sh
$ echo $FOO
BAR
另一种方法是拥有脚本,而不是设置环境变量,而是打印将设置环境变量的命令:
$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR
第三种方法是拥有一个脚本,该脚本在内部设置您的环境变量,然后在该环境中调用指定的命令:
$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR
最后一种方法可能非常有用,尽管它不给您当前外壳程序中的设置(以及您建立的所有其他设置和历史记录),但对于交互式使用来说很不方便。
为了首先导出VAR变量,最合逻辑且似乎可行的方法是获取变量:
. ./export.bash
要么
source ./export.bash
现在,当从主壳回显
echo $VAR
HELLO, VARABLE
现在我们将重置VAR
export VAR=""
echo $VAR
现在,我们将执行一个脚本来获取变量,然后取消设置它:
./test-export.sh
HELLO, VARABLE
--
.
代码:cat test-export.sh
#!/bin/bash
# Source env variable
source ./export.bash
# echo out the variable in test script
echo $VAR
# unset the variable
unset VAR
# echo a few dotted lines
echo "---"
# now return VAR which is blank
echo $VAR
这是一种方法
请注意:导出仅限于在主控制台中执行导出的脚本-因此,对于cron作业,我将其添加为如下所示的控制台...对于命令部分仍然存在疑问:这是您将如何操作从您的外壳中运行:
在命令提示符下(只要export.bash具有多个回显值)
IFS=$'\n'; for entries in $(./export.bash); do export $entries; done; ./v1.sh
HELLO THERE
HI THERE
猫v1.sh
#!/bin/bash
echo $VAR
echo $VAR1
现在,只要您可以使用它,就可以随时通过执行如下bash别名来使变量可用于脚本:
myvars ./v1.sh
HELLO THERE
HI THERE
echo $VAR
.
将此添加到您的.bashrc
function myvars() {
IFS=$'\n';
for entries in $(./export.bash); do export $entries; done;
"$@";
for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;
done
}
源您的bashrc文件,您可以随时执行上述操作...
无论如何回到其余的部分。
这样就可以全局使用它,然后执行脚本。
只需将其回显,然后对echo运行export即可!
猫出口
#!/bin/bash
echo "VAR=HELLO THERE"
现在在脚本或控制台中运行:
export "$(./export.bash)"
尝试:
echo $VAR
HELLO THERE
只要您知道使用上述方法在另一个脚本中期望的值,就可以使用多个值:
猫出口
#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"
猫test-export.sh
#!/bin/bash
IFS=$'\n'
for entries in $(./export.bash); do
export $entries
done
echo "round 1"
echo $VAR
echo $VAR1
for entries in $(./export.bash); do
variable=$(echo $entries|awk -F"=" '{print $1}');
unset $variable
done
echo "round 2"
echo $VAR
echo $VAR1
现在的结果
./test-export.sh
round 1
HELLO THERE
HI THERE
round 2
.
最后自动分配的最终更新读取了VARIABLES:
./test-export.sh
Round 0 - Export out then find variable name -
Set current variable to the variable exported then echo its value
$VAR has value of HELLO THERE
$VAR1 has value of HI THERE
round 1 - we know what was exported and we will echo out known variables
HELLO THERE
HI THERE
Round 2 - We will just return the variable names and unset them
round 3 - Now we get nothing back
脚本:cat test-export.sh
#!/bin/bash
IFS=$'\n'
echo "Round 0 - Export out then find variable name - "
echo "Set current variable to the variable exported then echo its value"
for entries in $(./export.bash); do
variable=$(echo $entries|awk -F"=" '{print $1}');
export $entries
eval current_variable=\$$variable
echo "\$$variable has value of $current_variable"
done
echo "round 1 - we know what was exported and we will echo out known variables"
echo $VAR
echo $VAR1
echo "Round 2 - We will just return the variable names and unset them "
for entries in $(./export.bash); do
variable=$(echo $entries|awk -F"=" '{print $1}');
unset $variable
done
echo "round 3 - Now we get nothing back"
echo $VAR
echo $VAR1
执行
set -o allexport
此后从文件中获取的任何变量都将导出到您的Shell中。
source conf-file
完成后,执行。这将禁用allexport模式。
set +o allexport
bash source export
Google 关键字的最高结果
根据情况的不同,另一种解决方法可能很有用:创建另一个继承导出变量的bash。这是@Keith Thompson回答的一个特例,将所有这些缺点都包括在内。
export.bash:
# !/bin/bash
export VAR="HELLO, VARIABLE"
bash
现在:
./export.bash
echo $VAR
. ./export.bash
bash
作为当前shell的子级调用。由于VAR
之前已导出,因此该调用将包含该变量。当然,如果你输入exit
的VAR
熄灭。你检查了吗