Schreiben eines Skriptinterpreters in Bash
Frage
Ich habe einen Bash-Wrapper für Ruby geschrieben, der verschiedene Einrichtungsschritte durchläuft.
Die einfachste Version ist:
#!/bin/bash
# ruby_wrapper.sh
ruby
Jetzt möchte ich diesen Wrapper wie normales Ruby verwenden können!Konkret möchte ich eine .rb-Datei erstellen, die diesen „Interpreter“ verwendet.
#!/path/to/ruby_wrapper.sh
# my_file.rb
puts "hello world"
Also möchte ich es können $ ./my_file.rb
anstatt $ ruby_wrapper.sh my_file.rb
Ist das möglich?
Der Dokumentation behauptet, dass es das nicht ist.
Beachten Sie, dass der Interpreter möglicherweise selbst kein Interpreterskript ist.
Aber ich verstehe nicht, warum nicht.Hat jemand eine Idee, dies zu umgehen?
Lösung
Versuchen Sie, Ihren Wrapper mit aufzurufen /usr/bin/env
.Es ist eigentlich eine gute Praxis, Ruby-Skripte damit auszuführen /usr/bin/env ruby
da Sie den Pfad zum nicht hart codieren müssen ruby
binär, das ist also nicht unnatürlich.
$ 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
Sehen Sie sich auch als Randnotiz an, wie ich es verwendet habe exec
im Wrapper-Skript.Dadurch kann der Ruby-Interpreter den Prozess Ihres Wrapper-Skripts übernehmen, anstatt als untergeordneter Prozess Ihres Skripts ausgeführt zu werden.Dadurch wird der Wrapper für den Aufrufer transparent (Signale werden beispielsweise direkt an Ruby und nicht an Bash übermittelt).