在bash中编写脚本解释器

die*_*mes 1 unix linux bash netbsd

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

最基本的版本是,

   #!/bin/bash 
   #   ruby_wrapper.sh
   ruby
Run Code Online (Sandbox Code Playgroud)

现在我希望能够像常规红宝石一样使用这个包装器!具体来说,我想创建一个使用这个"解释器"的.rb文件.

   #!/path/to/ruby_wrapper.sh
   #  my_file.rb
   puts "hello world"
Run Code Online (Sandbox Code Playgroud)

所以我希望能够$ ./my_file.rb而不是$ ruby_wrapper.sh my_file.rb

这可能吗?

文件称事实并非如此.

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

但我不明白为什么不.有没有人有任何想法来解决这个问题?

Joh*_*ica 9

尝试调用你的包装器/usr/bin/env.执行Ruby脚本实际上是一种很好的做法,/usr/bin/env 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
Run Code Online (Sandbox Code Playgroud)

另外作为旁注,看看我如何exec在包装器脚本中使用.这将允许ruby解释器接管您的包装脚本的进程,而不是作为脚本的子进程运行.这使得包装器对调用者是透明的(例如,信号将被直接传递给ruby而不是bash).