在 /usr/bin/env 中设置环境变量会在 Linux 上挂起进程

Setting environment variable in /usr/bin/env hangs process on Linux

而 Linux 上的 env 的 man 似乎表明您可以在执行命令之前设置新的环境变量。不幸的是,当我在 Linux 系统上的文件 shebang 中设置新变量时,该文件永远不会执行。

#!/usr/bin/env VAR1=foo bash
echo $VAR1

当我在 CentOS 或 Ubuntu 机器上执行这个文件时,它就在那里。

$ ./shell-env.sh
<nothing happens>

我觉得特别奇怪的是这在 OS X 和 BSD env.

上运行得非常好
$ ./shell-env.sh
foo
$

这只是 BSD env 和 Linux env 之间的区别吗?为什么 Linux 的手册页似乎说它应该以与 BSD 相同的方式工作?

P.S。我在这里的用例是覆盖 PATH 变量,因此我可以尝试在系统上找到一个 ruby 但它不在 PATH.

提前致谢!

有一种方法可以在执行 Ruby 脚本之前操纵环境,而无需使用某种包装脚本,但它并不漂亮:

#!/bin/bash
export FOO=bar
exec ruby -x "[=10=]" "$@"

#!ruby
puts ENV['FOO']

这通常用于需要操纵的深奥情况,例如PATHLD_LIBRARY_PATH 在执行程序之前,由于某些原因需要自包含。它适用于 Perl,也可能适用于其他人!