假设我有这个脚本
export.bash :
#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
当我执行脚本并尝试访问$VAR
时,我没有得到任何价值!
echo $VAR
是否可以通过执行 export.bash 来访问$VAR
而无需获取资源?
答案 0 :(得分:249)
是否可以通过执行
$VAR
而无需获取export.bash
来访问source
?
快速回答:否。
但是有几种可行的解决方法。
您已经提到的最明显的一个是使用.
或$ cat set-vars1.sh
export FOO=BAR
$ . set-vars1.sh
$ echo $FOO
BAR
在调用shell的上下文中执行脚本:
$ 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
第三种方法是使用一个脚本在内部设置环境变量,然后在该环境中调用指定的命令:
{{1}}
这最后一种方法非常有用,虽然它不便于交互使用,因为它不会为您提供当前shell中的设置(包含您构建的所有其他设置和历史记录)。
答案 1 :(得分:42)
为了首先导出VAR变量,最符合逻辑的似乎是工作方式是获取变量:
. ./export.bash
或
source ./export.bash
现在,当从主shell回显时,它可以正常工作
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作业一样,我会像下面的控制台一样添加它...对于命令部分仍然有问题:这里是你将如何从你的shell中运行:
在命令提示符下(只要export.bash有多个echo值)
IFS=$'\n'; for entries in $(./export.bash); do export $entries; done; ./v1.sh
HELLO THERE
HI THERE
cat 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上运行导出!
cat export.bash
#!/bin/bash
echo "VAR=HELLO THERE"
现在在脚本或控制台中运行:
export "$(./export.bash)"
尝试:
echo $VAR
HELLO THERE
多个值,只要您使用上述方法知道您在另一个脚本中的期望:
cat export.bash
#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"
cat 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
答案 2 :(得分:12)
找到一种有趣而巧妙的方法从文件中导出环境变量:
env.vars
中的:
foo=test
测试脚本:
eval `cat env.vars`
echo $foo # => test
sh -c 'echo $foo' # =>
export eval `cat env.vars`
echo $foo # => test
sh -c 'echo $foo' # => test
# a better one
export `cat env.vars`
echo $foo # => test
sh -c 'echo $foo' # => test
答案 3 :(得分:5)
执行
set -o allexport
在此之后您从文件中获取的任何变量都将导出到您的shell中。
source conf-file
当你完成执行时。这将禁用allexport模式。
set +o allexport
答案 4 :(得分:3)
另一种解决方法,取决于具体情况,它可能很有用:创建另一个继承导出变量的bash。这是@Keith Thompson答案的一个特例,将所有这些缺点。
<强> export.bash:强>
# !/bin/bash
export VAR="HELLO, VARIABLE"
bash
现在:
./export.bash
echo $VAR
答案 5 :(得分:1)
答案是否定的,但对我来说,我做了以下
脚本: myExport
#! \bin\bash
export $1
我的.bashrc中的别名
alias myExport='source myExport'
你仍然采购它,但也许以这种方式它更有用,而且对其他人来说很有趣。
答案 6 :(得分:1)
也许你可以在〜/ .zshrc,〜/ .bashrc中编写一个函数。
# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }
由于外部使用变量,可以避免编写脚本文件。
答案 7 :(得分:0)
我认为这无法完成,但我找到了使用 alias
的解决方法。只有当您将脚本放在脚本目录中时,它才会起作用。否则,您的别名将是无效名称。
解决方法的唯一要点是能够在具有相同名称的文件中包含一个函数,并且在使用它之前不必费心寻找它。将以下代码添加到文件 ~/.bashrc
:
alias myFunction='unalias myFunction && . myFunction && myFunction "$@"'
您现在无需先调用 sourcing 即可调用 myFunction
。