Написание переводчика скрипта в Bash
Вопрос
Я написал обертку 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).