我可以从bash脚本将变量导出到环境中而不需要获取它吗?

tar*_*lah 247 unix bash shell environment-variables

假设我有这个脚本

export.bash:

#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
Run Code Online (Sandbox Code Playgroud)

当我执行脚本,并尝试访问$VAR我没有价值!

echo $VAR
Run Code Online (Sandbox Code Playgroud)

有没有办法$VAR只通过执行export.bash来访问它而不需要采购它?

Kei*_*son 278

有没有办法$VAR通过执行export.bash而无需获取它来访问?

快速回答:没有.

但是有几种可能的解决方法.

您已经提到的最明显的一个是在调用shell的上下文中使用source.执行脚本:

$ cat set-vars1.sh 
export FOO=BAR
$ . set-vars1.sh 
$ echo $FOO
BAR
Run Code Online (Sandbox Code Playgroud)

另一种方法是让脚本而不是设置环境变量,打印将设置环境变量的命令:

$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR
Run Code Online (Sandbox Code Playgroud)

请注意,$VAR将输出连接到一行.如果您要设置多个内容,则应该在打印的命令中添加分号,这样它们在连接在一起后仍然有效.

第三种方法是使用脚本在内部设置环境变量,然后使用该环境调用指定的命令:

$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR
Run Code Online (Sandbox Code Playgroud)

最后一种方法非常有用,虽然它不便于交互使用,因为它不会为您提供当前shell中的设置(包含您构建的所有其他设置和历史记录).


Vin*_*yon 49

为了首先输出VAR变量,最符合逻辑的工作方式是获取变量:

. ./export.bash
Run Code Online (Sandbox Code Playgroud)

要么

source ./export.bash
Run Code Online (Sandbox Code Playgroud)

现在,当从主shell回显时,它可以工作

 echo $VAR
HELLO, VARABLE
Run Code Online (Sandbox Code Playgroud)

我们现在将重置VAR

export VAR=""
echo $VAR
Run Code Online (Sandbox Code Playgroud)

现在我们将执行一个脚本来获取变量,然后取消设置:

./test-export.sh 
HELLO, VARABLE
--
.
Run Code Online (Sandbox Code Playgroud)

代码: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
Run Code Online (Sandbox Code Playgroud)

这是一种方式

请注意:导出仅限于在主控制台中执行导出的脚本 - 因此,就像cron作业一样,我会像下面的控制台一样添加它...对于命令部分仍然有问题:这是你怎么做的从你的shell运行:

在命令提示符下(只要export.bash有多个echo值)

IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh 
HELLO THERE
HI THERE
Run Code Online (Sandbox Code Playgroud)

猫v1.sh

#!/bin/bash
echo $VAR
echo $VAR1
Run Code Online (Sandbox Code Playgroud)

现在只要这个用于您的使用 - 您可以通过执行这样的bash别名随时为您的脚本提供变量:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.
Run Code Online (Sandbox Code Playgroud)

将其添加到.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

}
Run Code Online (Sandbox Code Playgroud)

来源你的bashrc文件,你可以随时做...

无论如何回到其余部分..

这使得全局可用然后执行脚本..

只需回显它然后在回声上运行导出!

cat export.bash

#!/bin/bash
echo "VAR=HELLO THERE"
Run Code Online (Sandbox Code Playgroud)

现在在脚本或控制台中运行:

 export "$(./export.bash)"
Run Code Online (Sandbox Code Playgroud)

尝试:

echo $VAR
HELLO THERE
Run Code Online (Sandbox Code Playgroud)

只要您知道使用上述方法在另一个脚本中期望的内容,就可以使用多个值:

cat export.bash

#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

现在的结果

 ./test-export.sh 
round 1
HELLO THERE
HI THERE
round 2


.
Run Code Online (Sandbox Code Playgroud)

并且自动分配的最终最终更新读取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
Run Code Online (Sandbox Code Playgroud)

脚本: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
Run Code Online (Sandbox Code Playgroud)

  • 我想通过执行文件而不是通过采购来导出 VAR。 (2认同)

Van*_*Van 12

找到了一种从文件中导出环境变量的有趣而简洁的方法:

env.vars:

foo=test
Run Code Online (Sandbox Code Playgroud)

测试脚本:

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
Run Code Online (Sandbox Code Playgroud)


mdo*_*fe1 11

执行

set -o allexport
Run Code Online (Sandbox Code Playgroud)

此后从文件中获取的任何变量都将导出到您的Shell中。

source conf-file
Run Code Online (Sandbox Code Playgroud)

完成后,执行。这将禁用allexport模式。

set +o allexport
Run Code Online (Sandbox Code Playgroud)

  • @ekkis是的,它并没有完全回答这个问题,但是每当我用谷歌搜索如何从文件中导出变量时,就会出现这个线程。所以我只是把它放在那里给我自己。 (4认同)
  • 我对此表示赞同,因为最初的问题陈述让我明白这是我的根本解决方案。这里有关于 allexport 的官方文档:https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html (4认同)
  • 问题的全部重点是“如何在没有源的情况下导出”。该答案使用源。 (3认同)

Gon*_*tor 8

另一种解决方法取决于具体情况,它可能很有用:创建另一个继承导出变量的 bash 脚本。这是Keith Thompson 的回答的一个特例,将所有这些缺点。

文件export.bash:

# !/bin/bash
export VAR="HELLO, VARIABLE"
bash
Run Code Online (Sandbox Code Playgroud)

现在:

./export.bash
echo $VAR
Run Code Online (Sandbox Code Playgroud)


小智 5

答案是否定的,但对我来说,我做了以下事情

剧本:

我的导出

#! \bin\bash
export $1
Run Code Online (Sandbox Code Playgroud)

我的.bashrc 文件中的别名:

alias myExport='source myExport'
Run Code Online (Sandbox Code Playgroud)

你仍然会获取它,但也许通过这种方式它更有用并且对其他人来说更有趣。