假设我有这样的脚本:

export.bash:

#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"

当我执行脚本并试图访问$VAR时,我没有得到任何值!

echo $VAR

是否有一种方法通过执行export来访问$VAR。没有来源的Bash ?


当前回答

我有类似的问题调用ssh-agent -s在rsync的选项-e调用的脚本。

在脚本中,eval $(ssh-agent -s)不为下一次调用保留环境变量。

rsync -e 'source ssh-check-agent.sh -p 8022'不起作用,所以我做了一个变通方案。在脚本中,我在调用ssh-agent后将变量保存在一个临时文件中,如下:

echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK;" > /tmp/ssh-check-agent.vars
echo "export SSH_AGENT_PID=$SSH_AGENT_PID;" >> /tmp/ssh-check-agent.vars

然后在调用rsync (backup.sh)的脚本中调用:

source /tmp/ssh-check-agent.vars

问题是调用rsync的脚本必须由source (source backup.sh)调用。

我知道这不是问题(我使用两次源),但如果有人在rsync上有类似的问题,我在这里放了。

其他回答

也许你可以在~/中添加一个函数。ZSHRC或~/.bashrc。

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }

由于使用了外部变量,可以避免使用脚本文件。

这个变通方法在其他地方也有暗示,但可能不是那么清楚:

在脚本中,设置变量后,启动一个新的shell,而不是返回。

我的用例是,我有许多打开的终端,在其中一些终端中,我想要一些变量的值,而在其他终端中,我想要其他值。

由于使用source可能更难记住,这种方法的一个小优点是,当您需要一段时间才能意识到您忘记使用source时,您必须从头开始。

(对我来说,使用源脚本更有意义,因为缺失的变量会立即被注意到。)

是否有任何方法通过执行export来访问$VAR。没有来源的Bash ?

快速回答:不。

但也有几种可能的变通办法。

您已经提到的最明显的方法是使用source or。在调用shell的上下文中执行脚本:

$ 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

最后一种方法可能非常有用,但对于交互式使用来说不太方便,因为它不能提供当前shell中的设置(以及您已建立的所有其他设置和历史)。

简单幼稚的方法有效:

脚本1:

回显"something" > /tmp/myvar

脚本2:

myvar=$(cat /tmp/myvar)

执行

set -o allexport

在此之后,您从文件中获取的任何变量都将在您的shell中导出。

source conf-file

当你完成时执行。这将禁用alleexport模式。

set +o allexport