如果命令my_command
有以下输出:
VAR1=some_value
VAR2=other_value
是否可以从 shell 脚本调用my_command
,以便将VAR1
和VAR2
保存为环境变量?
我尝试了以下方法,但没有一个有效:
#!/bin/bash
source my_command
export `my_command`
但是如果我手动输入
export `my_command`
在终端控制台中,然后保存两个变量。
答案1
如果你有my_command
这样的情况:
#!/bin/sh
echo 'VAR1=some_value'
echo 'VAR2=other_value'
运行它显然会打印
VAR1=some_value
VAR2=other_value
现在,source my_command
将跑步当前 shell 中的脚本,只会生成分配作为输出。source
如果my_command
不打印作业,而是直接执行,则可以使用。
export $(my_command)
将获取脚本的输出,并将其传递给导出,这会将变量放入当前的 shell 环境中,但仅当相关变量不包含空格或全局字符时它才有效,因为命令替换是不带引号的。放入"$(my_command)"
引号并没有真正的帮助,因为 thenexport
被VAR1=some_value\nVAR2=other_value
视为一个参数,并且 onlyVAR1
被设置。
请注意,在另一个脚本中以任何其他方式运行export $(my_command)
或设置变量不会在父 shell 中设置这些变量。如果您希望在交互式 shell 中进行分配,则必须在那里运行它们,但您可以将分配包装在进行source
分配的函数或脚本中。
一种明显的解决方案是执行该ssh-agent
操作,并让脚本输出export
命令来输出它设置的变量。那么跑起来就够了eval "$(my_command)"
。
如果我们不想这样做,我们可以set -a
在脚本之前使用,让 shell 自动导出设置的任何变量。
所以,
$ set -a
$ eval "$(my_command)"
在 Bash 中,我们可以使用declare -p
检查变量是否已导出 ( -x
):
$ declare -p VAR1 VAR2
declare -x VAR1="some_value"
declare -x VAR2="other_value"
使用eval
此处将允许脚本输出带引号的字符串,例如VAR1="foo bar"
,并且它们将被正确处理。eval
还将运行脚本my_command
输出的任何其他内容,而不仅仅是分配,但如果您不信任my_command
,则根本不应该运行它。
答案2
您无法在从父 shell 调用的 shell 脚本中设置父 shell 的变量。任何一个
- 像往常一样在脚本中设置变量,但获取它:
. my_command
让脚本打印要设置的变量
stdout
并eval
评估结果$ cat foo.sh #!/bin/sh echo FOO=foo echo BAR=bar $ ./foo.sh FOO=foo BAR=bar $ eval $(./foo.sh) $ echo $FOO foo $ echo $BAR bar