Написание интерпретатора сценариев в Bash - PullRequest
1 голос
/ 19 мая 2011

Я написал оболочку bash для ruby, которая проходит через различные этапы установки.

Самая основная версия,

   #!/bin/bash 
   #   ruby_wrapper.sh
   ruby

Теперь я хочу использовать эту оболочку, как обычный рубин! В частности, я хочу создать файл .rb, который использует этот «интерпретатор».

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

Так что я хочу иметь возможность сделать $ ./my_file.rb вместо $ ruby_wrapper.sh my_file.rb

Возможно ли это?

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

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

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

1 Ответ

9 голосов
/ 19 мая 2011

Попробуйте вызвать оболочку с /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

Также в качестве примечания смотрите, как я использовал exec в скрипте-оболочке. Это позволит интерпретатору ruby ​​взять на себя процесс вашего сценария-оболочки, а не запускаться как дочерний процесс вашего сценария. Это делает оболочку прозрачной для вызывающей стороны (например, сигналы будут передаваться непосредственно на ruby, а не на bash).

...