将命令输出保存为环境变量

将命令输出保存为环境变量

如果命令my_command有以下输出:

VAR1=some_value
VAR2=other_value

是否可以从 shell 脚本调用my_command,以便将VAR1VAR2保存为环境变量?

我尝试了以下方法,但没有一个有效:

#!/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)"引号并没有真正的帮助,因为 thenexportVAR1=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
  • 让脚本打印要设置的变量stdouteval评估结果

    $ 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
    

相关内容