在 /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']
这通常用于需要操纵的深奥情况,例如PATH
或 LD_LIBRARY_PATH
在执行程序之前,由于某些原因需要自包含。它适用于 Perl,也可能适用于其他人!
而 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']
这通常用于需要操纵的深奥情况,例如PATH
或 LD_LIBRARY_PATH
在执行程序之前,由于某些原因需要自包含。它适用于 Perl,也可能适用于其他人!