Escrevendo um interpretador de script no bash
Pergunta
Eu escrevi um wrapper bash para Ruby que passa por várias etapas de configuração.
A versão mais básica é,
#!/bin/bash
# ruby_wrapper.sh
ruby
Agora quero poder usar esse wrapper como o Ruby normal!Especificamente, quero criar um arquivo .rb que use esse "intérprete".
#!/path/to/ruby_wrapper.sh
# my_file.rb
puts "hello world"
Então eu quero ser capaz de fazer $ ./my_file.rb
em vez de $ ruby_wrapper.sh my_file.rb
Isso é possível?
O documentação afirma que não é.
Observe que o próprio intérprete pode não ser um script de intérprete.
Mas não vejo por que não.Alguém tem alguma idéia para contornar isso?
Solução
Tente invocar seu wrapper com /usr/bin/env
.Na verdade, é uma boa prática executar scripts Ruby com /usr/bin/env ruby
já que você não precisa codificar o caminho para o ruby
binário, então isso não é antinatural.
$ 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
Também como observação lateral, veja como usei exec
no script do wrapper.Isso permitirá que o interpretador Ruby assuma o processo do seu script wrapper em vez de executá-lo como um processo filho do seu script.Isso torna o wrapper transparente para o chamador (os sinais serão entregues diretamente ao Ruby em vez de ao bash, por exemplo).