【问题标题】:Writing an script interpreter in bash在 bash 中编写脚本解释器
【发布时间】:2011-05-19 07:07:33
【问题描述】:

我为 ruby​​ 编写了一个 bash 包装器,它通过各种设置步骤。

最基本的版本是,

   #!/bin/bash 
   #   ruby_wrapper.sh
   ruby

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

   #!/path/to/ruby_wrapper.sh
   #  my_file.rb
   puts "hello world"

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

这可能吗?

documentation 声称不是。

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

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

【问题讨论】:

标签: linux bash unix netbsd


【解决方案1】:

尝试使用/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 用于可移植性的技巧,但没有意识到它会绕过这个限制。
猜你喜欢
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
相关资源
最近更新 更多