2

我遇到了/usr/bin/env的一个奇怪问题……我设计了一个简单的脚本来显示这个问题。该脚本在 Ruby 中,但在 Python 中的类似脚本也会发生同样的情况。这是脚本:

#!/usr/bin/env ruby

p ARGV

另一个没有/usr/bin/env

#!/data/software/ruby-1.9.2-p180/bin/ruby

p ARGV

如您所见,它应该只打印脚本参数。它在头节点上完美运行:

[gusev@scyld test]$ which ruby
/data/software/ruby-1.9.2-p180/bin/ruby
[gusev@scyld test]$ ./script.no_usr_bin_env.rb 1 2 3
["1", "2", "3"]
[gusev@scyld test]$ ./script.usr_bin_env.rb 1 2 3
["1", "2", "3"]

但是在计算节点上运行时,卡住了:

[gusev@scyld test]$ qsub -d $(pwd) -I
qsub: waiting for job 176427.scyld.localdomain to start
qsub: job 176427.scyld.localdomain ready

-bash-3.2$ ./script.no_usr_bin_env.rb 1 2 3
["1", "2", "3"]
-bash-3.2$ ./script.usr_bin_env.rb 1 2 3
<stuck>

/usr/bin/env在两台机器上完全相同:

[gusev@scyld test]$ md5sum /usr/bin/env
7ada476000967f2e4cca2bc669045479  /usr/bin/env
[gusev@scyld test]$ qsub -I -d $(pwd)
qsub: waiting for job 176428.scyld.localdomain to start
qsub: job 176428.scyld.localdomain ready

-bash-3.2$ md5sum /usr/bin/env
7ada476000967f2e4cca2bc669045479  /usr/bin/env

我知道使用/usr/bin/env处理参数可能很棘手。但是我们有很多软件都在使用它,我们不能只修复它们。我能做些什么来解决这个问题吗?

4

1 回答 1

1

#!/usr/bin/env ruby导致脚本ruby$PATH. 您$PATH在计算节点上可能会有所不同,这很可能是由于qsub.

一个快速而肮脏的解决方法是:

PATH=/data/software/ruby-1.9.2-p180/bin:$PATH ./script.usr_bin_env.rb 1 2 3

但是您应该找到一种更简洁的方法来确保$PATH在执行 Ruby 脚本之前正确设置。

有关更多详细信息,请在计算节点上尝试which rubytype rubyecho $PATH,并确保该ruby命令确实有效。

(有关#!/usr/bin/env ...vs.的更多讨论#!.../ruby,请参阅这个问题的回答)。

于 2012-12-07T08:46:43.027 回答