Linux 用bash编写脚本解释器

Linux 用bash编写脚本解释器,linux,bash,unix,netbsd,Linux,Bash,Unix,Netbsd,我为ruby编写了一个bash包装器,它经历了各种设置步骤 最基本的版本是, #!/bin/bash # ruby_wrapper.sh ruby 现在我希望能够像普通ruby一样使用这个包装器!具体来说,我想创建一个使用这个“解释器”的.rb文件 因此,我希望能够执行$./my_file.rb而不是$ruby_wrapper.sh my_file.rb 这可能吗 他们声称事实并非如此 请注意,解释器本身可能不是解释器脚本 但我不明白为什么不。有人有什么想法可以绕过这个

我为ruby编写了一个bash包装器,它经历了各种设置步骤

最基本的版本是,

   #!/bin/bash 
   #   ruby_wrapper.sh
   ruby
现在我希望能够像普通ruby一样使用这个包装器!具体来说,我想创建一个使用这个“解释器”的.rb文件

因此,我希望能够执行
$./my_file.rb
而不是
$ruby_wrapper.sh my_file.rb

这可能吗

他们声称事实并非如此

请注意,解释器本身可能不是解释器脚本


但我不明白为什么不。有人有什么想法可以绕过这个问题吗?

尝试使用
/usr/bin/env
调用您的包装器。实际上,使用
/usr/bin/env Ruby
执行Ruby脚本是一种很好的做法,因为您不必硬编码到
Ruby
二进制文件的路径,因此这不是不自然的

$ cat ruby_wrapper.sh 
#!/bin/bash
exec ruby "$@"

$ cat wrapped.rb 
#!/usr/bin/env /tmp/ruby_wrapper.sh
puts "hello world"

$ ./wrapped.rb 
hello world

另请注意,我在包装器脚本中如何使用
exec
。这将允许ruby解释器接管包装器脚本的进程,而不是作为脚本的子进程运行。这使包装器对调用方透明(例如,信号将直接传递到ruby而不是bash)。

尝试使用
/usr/bin/env
调用包装器。实际上,使用
/usr/bin/env Ruby
执行Ruby脚本是一种很好的做法,因为您不必硬编码到
Ruby
二进制文件的路径,因此这不是不自然的

$ cat ruby_wrapper.sh 
#!/bin/bash
exec ruby "$@"

$ cat wrapped.rb 
#!/usr/bin/env /tmp/ruby_wrapper.sh
puts "hello world"

$ ./wrapped.rb 
hello world

另请注意,我在包装器脚本中如何使用
exec
。这将允许ruby解释器接管包装器脚本的进程,而不是作为脚本的子进程运行。这使包装器对调用方透明(例如,信号将直接传递到ruby而不是bash)。

您链接和引用的文档是针对NetBSD的,而不是Linux。正确,但在Linux上也是如此。>解释器必须是本身不是脚本的可执行文件的有效路径名。您链接和引用的文档适用于NetBSD,而不是Linux。为True,但在Linux上也是如此。>解释器必须是本身不是脚本的可执行文件的有效路径名。非常好,谢谢!我读过关于/usr/bin/env技巧用于可移植性的文章,但没有意识到它会绕过这个限制。太好了,谢谢!我读过关于/usr/bin/env技巧用于可移植性的文章,但没有意识到它会绕过这个限制。