7 votes

#!/usr/bin/env Interpreter Arguments -- scripts portables avec des arguments pour l'interpréteur.

Parce que les interprètes tels que zsh, bash, Python, perl peuvent être situés à différents endroits du système de fichiers, les scripts ont souvent un shebang qui utilise env pour la portabilité, par exemple #!/usr/bin/env zsh . Cependant, comme http://en.wikipedia.org/wiki/Shebang_(Unix)#Portabilité explique, de nombreux systèmes, y compris Linux, ne permettent pas de passer des arguments à l'interpréteur.

Souvent, j'aimerais faire quelque chose comme #!/usr/bin/env zsh -f pour éviter que mon script ne lise jamais mon ~/.zshenv ou je voudrais faire #!/usr/bin/env perl -w etc. Cela fonctionne sous OS X, mais pas sous Linux.

Quelle est la solution de contournement pour cela ? Puis-je avoir le meilleur des deux mondes : portabilité et arguments pour l'interprète ? Si possible, donnez une solution de contournement générale qui fonctionne pour tous les interpréteurs, pas seulement zsh.

6voto

fccoelho Points 1546

Voici une solution en ligne pour contourner le problème de portabilité de ZSH.

#! /bin/sh

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

## Your ZSH script here

Voici d'autres méthodes à essayer

  • Passage de variables env via /usr/bin/env qui modifient le comportement de la même façon que --options comme faire

    #! /usr/bin/env POSIXLY\_CORRECT=1 bash
  • En utilisant des astuces de commentaire, comme la façon dont ce script commence à utiliser SH mais invoque TCL sur le même script.

    #! /bin/sh
    # \\
    TCLBIN=/usr/bin/tclsh; \\
    exec $TCLBIN "$0" "$@"
    # Execute the rest via tclsh
    set argc
  • En définissant l'option une fois dans l'interpréteur, si l'option --options transmis n'affectent pas la comportement en charge

    #! /usr/bin/env bash
    # Exit if any error detected
    set -e
  • Pour perl, si vous êtes en mesure d'utiliser des versions plus récentes, cela peut fonctionner à la place de -w :

    #! /usr/bin/env perl
    use warnings;
  • Utilisation d'un bootstrap invoke.sh script au lieu de /usr/bin/env pour utiliser votre PATH, en appelant avec /path/to/invoke.sh script avec votre script commençant par #! zsh -f

    #! /bin/sh
    
    SCRIPT=$1
    shift 1
    cmd=\`sed -n -e 's:#! \\?::' -e '1p' $SCRIPT\`
    exec $cmd $SCRIPT

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X