#! / usr / bin / env Interpreter-Argumente - tragbare Skripte mit Argumenten für den Interpreter

7

Da sich Interpreter wie zsh, bash, python und perl möglicherweise an verschiedenen Stellen im Dateisystem befinden, haben Skripte häufig einen Shebang, der envfür die Portabilität verwendet wird, z #!/usr/bin/env zsh. Wie http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability erklärt, erlauben viele Systeme, einschließlich Linux, die Weitergabe von Argumenten an den Interpreter nicht.

Oft möchte ich etwas tun #!/usr/bin/env zsh -f, um zu verhindern, dass mein Skript jemals mein Skript liest ~/.zshenv, oder ich möchte dies tun #!/usr/bin/env perl -wusw. Dies funktioniert unter OS X, aber nicht unter Linux.

Was ist die Problemumgehung dafür? Kann ich das Beste aus beiden Welten haben: Portabilität und Argumente für den Dolmetscher? Geben Sie nach Möglichkeit eine allgemeine Problemumgehung an, die für alle Dolmetscher funktioniert, nicht nur für zsh.

huyz
quelle

Antworten:

6

Hier ist eine Inline-Lösung, um das Portabilitätsproblem für ZSH zu umgehen.

#! /bin/sh

if [ -z "$IN_ZSH" ]; then
  export IN_ZSH=1
  exec zsh -f "$0" "$@"
fi

## Your ZSH script here

Einige andere Methoden, die Sie ausprobieren sollten, sind:

  • Übergeben von env-Variablen über / usr / bin / env, die das Verhalten --optionswie folgt ändern
    #! / usr / bin / env POSIXLY_CORRECT = 1 Bash
  • Verwenden Sie clevere Kommentartricks, z. B. wie dieses Skript mit SH beginnt, aber TCL für dasselbe Skript aufruft
    #! / bin / sh
    # \
    TCLBIN = / usr / bin / tclsh; \.
    exec $ TCLBIN "$ 0" "$ @"
    # Führen Sie den Rest über tclsh aus
    setze argc
  • Das einmalige Festlegen der Option im Interpreter, wenn die --optionsÜbergabe das Ladeverhalten nicht beeinflusst
    #! / usr / bin / env bash
    # Beenden, wenn ein Fehler festgestellt wird
    setze -e
  • Wenn Sie für Perl neuere Versionen verwenden können, funktioniert dies möglicherweise anstelle von -w:
    #! / usr / bin / env perl
    Warnungen verwenden;
  • Verwenden Sie ein Bootstrap- invoke.shSkript anstelle von / usr / bin / env, um Ihren PATH zu verwenden, und rufen Sie mit auf, /path/to/invoke.sh scriptwobei Ihr Skript mit beginnt#! zsh -f
    #! / bin / sh

    SCRIPT = $ 1
    Schicht 1
    cmd = `sed -n -e 's: #! \? :: '-e' 1p '$ SCRIPT`
    exec $ cmd $ SCRIPT
Bryan Drewery
quelle
Für die zsh-spezifische [ "x$ZSH_VERSION" = "x" ] && exec zsh -f "$0" "$@"
Problemumgehung
Danke für die Recherche. Ich wusste nicht, dass `#! / usr / bin / env POSIXLY_CORRECT = 1 bash` würde funktionieren.
Huyz
1
Ich denke, es gibt keine einzige "allgemeine Lösung", die sonst niemand anbieten kann. Also werde ich deine Antwort akzeptieren. Hoffentlich bekommt Linux eines Tages das Programm.
Huyz
#! /usr/bin/env POSIXLY_CORRECT=1 bashfunktioniert nicht so, als ob du /usr/bin/env "POSIXLY_CORRECT=1 bash" scriptan der Shell geschrieben hättest .
r3m0t