Вопрос

Я написал обертку Bash для Ruby, которая проходит различные шаги настроек.

Самая базовая версия - это,

   #!/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

Это возможно?

the Документация утверждает, что это нет. т.

Обратите внимание, что интерпретатор не может быть скриптом интерпретатора.

Но я не понимаю, почему нет.У кого-нибудь есть идеи, чтобы обойти это?

Это было полезно?

Решение

Try invoking your wrapper with /usr/bin/env. It's actually good practice to execute Ruby scripts with /usr/bin/env ruby as you don't have to hard code the path to the ruby binary, so this is not unnatural.

$ 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

Also as a side note see how I've used exec in the wrapper script. This will allow the ruby interpreter to take over your wrapper script's process rather than run as a child process of your script. This makes the wrapper transparent to the caller (signals will be delivered directly to ruby rather than to bash, for example).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top