将 env 与文件中的环境变量一起使用

将 env 与文件中的环境变量一起使用

假设我有一个e包含以下内容的文件(名为 ):

a=3
b=“5 6”

我怎样才能让每一个都被解释为一个单独的参数env?也就是说,使其等效于:

$ env a=3 b="5 6" ruby​​ -e 'p ENV["a"]; p ENV["b"]'
“3”
“5 6”
$ env a=3 "b=5 6" ruby​​ -e 'p ENV["a"]; p ENV["b"]'
“3”
“5 6”

由于空间的原因,这显然不起作用:

env $(cat e) ruby -e 'p ENV["a"]; p ENV["b"]'

但这个也没有:

IFS=$'\n' env $(cat e) ruby -e 'p ENV["a"]; p ENV["b"]'

引用$(cat e)将导致:

“1\nb=2 3”

答案1

这是一个没有使用正确工具来完成工作的例子。 env不是唯一设置环境变量然后链式加载另一个程序的工具。并且它不会从文件中读取变量数据。

当然,.akasource命令也不是适合这项工作的工具。

  1. 它允许文件意外地包含 shell 命令以外简单的变量分配,在某些情况下(取决于配置文件是什么)可能是一个巨大的安全漏洞。
  2. 问题中示例中的一系列作业,来源为., 集变量,不环境变量。它们不会自动导出。

正确的工具是来自此类工具的多个工具集中的普通链式加载工具。

其中一位read-conf来自诺什工具集,旨在准确读取此类配置文件(例如/etc/rc.conf来自——比如说——PC-BSD)并设置环境变量没有实施并开放配置数据文件到整个 shell 语言语法:

jdebp % uname
Linux
jdebp % 目录 e
a=3
b=“5 6”
jdebp % read-conf e printenv | jdebp % read-conf e printenv | jdebp尾部-n 3
用户=jdebp
a=3
b=5 6
杰德BP%
jdebp % uname
自由BSD
jdebp % read-conf /etc/rc.conf printenv | jdebp % read-conf /etc/rc.conf头-n 2
cron_enable=否
sendmail_msp_queue_enable=否
杰德BP%

另一个这样的工具是韦恩·马歇尔的runenv来自罪犯。

答案2

你甚至不需要env这里。在任何类似 Bourne 的 shell 中(假设该文件的sh语法与您的示例中类似):

(set -a; . ./e && ruby -e 'p ENV["a"]; p ENV["b"]')

set -a导致所有未来的变量分配都导出到环境中)。

你还可以这样做:

cat e - << 'EOF' | paste -sd ' ' - | sh
ruby -e 'p ENV["a"]; p ENV["b"]'
EOF

也就是说,将e文件中的所有行和 ruby​​ 命令行连接起来,构建一个长命令行以sh进行解释(仍然假设该e文件的sh语法如双引号所建议的那样)。假设分配是单行的。

相关内容