【问题标题】:How to set multiple environment variables from output of other command in bash?如何从bash中其他命令的输出中设置多个环境变量?
【发布时间】:2021-03-20 18:12:53
【问题描述】:

我设置了一个包含多个值的变量。 (这是我从heroku config --shell 得到的,已编辑)
保存命令输出的命令是

envvars=`heroku config --shell -a heroku-app`

echo "$envvars"的结果是这样的:

BH_SERVER=000000000000000000
DATABASE_URL='postgres://stringno1:randomstring1@someserver.com:5432/randomstring2'
DISCORD_TOKEN=some.veryveryveryvery.long.token.string
EXM_SERVER=000000000000000001
MUTED_SERVER='000000000000000002, 000000000000000003'
SUPER_USER='000000000000000004, 000000000000000005'
TEST_SERVER=000000000000000006
TZ=Asia/Seoul

现在我想将这些值设置为环境变量。这些不能是永久性的,因为这些只有 python 应用程序需要,稍后将在脚本中执行。我想我可以使用 = 作为分隔键和值的分隔符,但不能 100% 确定这一点。 (我不知道heroku convar 效果如何)

我希望有类似的输出。

echo $BH_SERVER
# 000000000000000000
echo $DATABASE_URL
# postgres://stringno1:randomstring1@someserver.com:5432/randomstring2
# Note that there is no ' in start and end of line
echo $DISCORD_TOKEN
# some.veryveryveryvery.long.token.string
# Note that . is still there.
echo $MUTED_SERVER
# 000000000000000002, 000000000000000003
# Even if there is space in string, it should be treated as one line
# Also, there is no ' in start and end of line
echo $TZ
# Asia/Seoul
# / is not interpreted. I think this is normal.

有一些已经回答的问题,但我没有找到任何符合我条件的答案。

我放了git-bash标签,因为我正在研究Git Bash,但我认为这个问题的解决方案与Bash相同。

【问题讨论】:

  • 你试过 eval $envvars 了吗?
  • @Lety 你的意思是eval $envvar?这只是停止脚本工作。我认为它正在等待用户输入但不确定。

标签: bash environment-variables git-bash


【解决方案1】:

我不确定,但这应该可行

eval $(echo $envvars) ./script.sh

eval $(echo $envvars) python script.py

【讨论】:

  • 两者都不起作用。处理'0000, 0000'-like 行时显示“不是有效标识符”
  • 我已经更新了解决这个问题的答案
【解决方案2】:

您可以使用eval。确保使用双引号,否则带有空格和引号的设置会被破坏。

eval "$envvars"

eval "$(heroku config --shell -a heroku-app)"

您可以使用子shell 来隔离对一段代码的更改。

# Parentheses create a subshell, or child process.
# Variables set in a child process don't affect the parent.
(
    eval "$(heroku config --shell -a heroku-app)"
    echo "$BH_SERVER"
    echo "$DATABASE_URL"
    echo "$DISCORD_TOKEN"
    echo "$MUTED_SERVER"
    echo "$TZ"
)

# The variables will be unset here.

【讨论】:

    【解决方案3】:

    您可以将 echo 输出添加到临时文件,获取文件,然后删除临时文件 :

    echo $envvars > /tmp/tmp.env && source /tmp/tmp.env && rm /tmp/tmp.env

    如果在 gitbash /tmp 上不可用,请使用另一个可用路径来创建临时文件

    您也可以使用以下不需要临时文件的格式

    echo $envvars | source /dev/stdin

    【讨论】:

    • 令人惊讶的是,它有效!我不喜欢“创建新的临时文件”的概念,但它有效。我想知道有什么方法可以不创建“临时”文件……无论如何,谢谢。
    • 我已经修改了答案,你可以试试没有临时文件“echo $envvars | source /dev/stdin”的第二种格式
    • 第二个不行。管道在子外壳中运行。
    • 第二种方法不起作用。 git-bash 似乎不喜欢 /dev/stdin 的东西。不管怎样,git-bash 似乎在使用 Windows 自己的临时目录(%temp%),这很高兴知道。
    猜你喜欢
    • 2014-11-29
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2016-04-16
    • 1970-01-01
    • 2022-07-20
    相关资源
    最近更新 更多