gpt4 book ai didi

linux - 如何修复/usr/bin/env agrument 处理?

转载 作者:太空狗 更新时间:2023-10-29 12:35:06 26 4
gpt4 key购买 nike

我在使用/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 处理参数可能很棘手。但是我们有很多软件使用这个,我们不能只修复它们。我能做些什么来解决这个问题吗?

最佳答案

#!/usr/bin/env ruby​​ 导致脚本由 $PATH 中的第一个 ruby 可执行文件执行。您的 $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 answerthis question)。

关于linux - 如何修复/usr/bin/env agrument 处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13759588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com