假设我有一个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
命令也不是适合这项工作的工具。
- 它允许文件意外地包含 shell 命令以外简单的变量分配,在某些情况下(取决于配置文件是什么)可能是一个巨大的安全漏洞。
- 问题中示例中的一系列作业,来源为
.
, 集壳变量,不环境变量。它们不会自动导出。
正确的工具是来自此类工具的多个工具集中的普通链式加载工具。
其中一位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
语法如双引号所建议的那样)。假设分配是单行的。