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

Art*_*son 6 linux shell shebang

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

#!/usr/bin/env VAR1=foo bash
echo $VAR1
Run Code Online (Sandbox Code Playgroud)

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

$ ./shell-env.sh
<nothing happens>
Run Code Online (Sandbox Code Playgroud)

我觉得特别奇怪的是,它在带有 BSD 的 OS X 上运行得非常好env

$ ./shell-env.sh
foo
$
Run Code Online (Sandbox Code Playgroud)

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

PS 我这里的用例是覆盖PATH变量,所以我可以尝试在系统上找到 a ruby,但它不在PATH.

先感谢您!

mwp*_*mwp 2

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

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

#!ruby
puts ENV['FOO']
Run Code Online (Sandbox Code Playgroud)

PATH这通常是为深奥的情况保留的,例如您需要LD_LIBRARY_PATH在执行程序之前进行操作,并且由于某种原因它需要是独立的。它适用于 Perl,也可能适用于其他人!