Écrire un interpréteur de script en bash
Question
J'ai écrit un wrapper bash sur Ruby qui passe par différentes étapes de configuration.
La version la plus basique est,
#!/bin/bash
# ruby_wrapper.sh
ruby
Maintenant, je veux pouvoir utiliser ce wrapper comme un rubis ordinaire !Plus précisément, je souhaite créer un fichier .rb qui utilise cet "interprète".
#!/path/to/ruby_wrapper.sh
# my_file.rb
puts "hello world"
Alors je veux pouvoir faire $ ./my_file.rb
au lieu de $ ruby_wrapper.sh my_file.rb
Est-ce possible?
Le Documentation prétend que ce n'est pas le cas.
Notez que l'interpréteur peut ne pas être lui-même un script d'interpréteur.
Mais je ne vois pas pourquoi.Quelqu'un a-t-il des idées pour contourner ce problème ?
La solution
Essayez d'invoquer votre wrapper avec /usr/bin/env
.C'est en fait une bonne pratique d'exécuter des scripts Ruby avec /usr/bin/env ruby
car vous n'avez pas besoin de coder en dur le chemin d'accès au ruby
binaire, ce n’est donc pas anormal.
$ 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
Aussi, en guise de remarque, voyez comment j'ai utilisé exec
dans le script wrapper.Cela permettra à l'interpréteur Ruby de reprendre le processus de votre script wrapper plutôt que de s'exécuter en tant que processus enfant de votre script.Cela rend le wrapper transparent pour l'appelant (les signaux seront transmis directement à Ruby plutôt qu'à Bash, par exemple).