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?

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top