Wie spezifizieren Sie alternative Skriptinterpreter (Shebangs)?

8

In einer ausführbaren Datei geben Sie die Umgebung mit einem Shebang an:

#!/usr/bin/env ruby

# ruby code here

Was aber, wenn Sie mehrere mögliche Umgebungen angeben möchten? Wenn Sie beispielsweise mehrere Versionen von Ruby installiert haben, möchten Sie möglicherweise Folgendes tun

#!/path/to/better/ruby/version
#!/path/to/alternative/ruby/version

# ruby code here

Wie können Sie mehrere mögliche Umgebungen für eine einzelne ausführbare Datei angeben?

sffc
quelle

Antworten:

6

Die kurze Antwort ist, dass Sie nicht können.

Die Idee hinter der Verwendung #!/usr/bin/env rubystatt einfach #!/usr/bin/rubyist, die Ruby-Binärdatei zu verwenden, die sich zuerst im Pfad des Benutzers befindet. Dann hängt Ihr Skript nicht davon ab, dass sich Ruby auf jedem System am selben Ort befindet. Immerhin könnte eine ‚normale‘ Rubin Lage sein /usr/bin/ruby, /usr/local/bin/ruby, /opt/ruby-1.8.7/bin/rubyusw ...

Wenn Sie einige Werte fest codieren oder eine Suchlogik ausführen möchten, können Sie jederzeit ein Wrapper-Shell-Skript erstellen:

#!/bin/sh

for ruby in /usr/bin/ruby /usr/local/bin/ruby
do
    if [ -x "$ruby" ]
    then
        "$ruby" myscript.rb
        break
    fi
done

Und wenn Sie ausreichend motiviert sind, können Sie sogar ein Ruby-Skript (oder ein anderes Skript) in das Shell-Skript einbetten .

mrb
quelle
Das macht Sinn. Ich habe vor, dieses Skript auf mehreren Computern auszuführen, von denen jeder einen anderen Pfad zu Ruby 1.9 hat, und sie verwenden nicht alle Ruby 1.9 als Standardinterpreter. Ich werde versuchen, das Wrapper-Skript zu verwenden. Vielen Dank!
sffc
1
Vergessen Sie nicht, $@wenn Sie das endgültige Skript aufrufen, um mögliche "$ruby" myscript.rb $@
Argumente
1

Ich werde mrb widersprechen und sagen, dass Sie Alternativen machen können, ohne das "#!" Linie.

Angenommen, Sie haben ein Ruby-Skript mit #!/usr/bin/env rubyder ersten Zeile.

Wenn Sie /path/to/better/ruby/version/whateverdas Skript ausführen möchten , legen Sie zunächst die Umgebungsvariable PATH fest /path/to/better/ruby/version:

PATH=/path/to/better/ruby/version:$PATH  whatever_script_name_is

Sie möchten /usr/local/bin/rubydas Skript ausführen? Stellen Sie PATH entsprechend ein:

PATH=/usr/local/bin:$PATH  whatever_script_name_is

Beachten Sie, dass das Fummeln mit PATH andere Probleme verursachen kann, wenn sich die ausführbare Ruby-Datei, mit der Sie das Skript ausführen möchten, mit anderen alternativen Programmen im selben Verzeichnis befindet . Zum Beispiel, wenn /usr/local/binBSD hat cat, grep, sedin es so gut wie ruby, dann , wenn Sie setzen PATH=/usr/local/bin:$PATHSie die BSD ausführbaren Dateien anstelle von Linux ausführbaren Dateien zu bekommen. Das könnte ein Problem darstellen.

Bruce Ediger
quelle