我遇到了一个奇怪的问题 / 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 处理参数可能很棘手。但是我们有很多软件使用它,我们不能只修复它们。我能做些什么来解决这个问题吗?
答案 0 :(得分: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
但是你应该找到一种更简洁的方法来确保在执行Ruby脚本之前正确设置$PATH
。
有关更多详细信息,请在计算节点上尝试which ruby
或type ruby
和echo $PATH
,并确保ruby
命令确实有效。
(有关#!/usr/bin/env ...
与#!.../ruby
的更多讨论,请参阅my answer至this question)。