27 votes

Il faut une coquille moins bête

Sur mon système Ubuntu, /usr/bin/ssh-copy-id contient un curieux morceau de code en haut. Il semble vérifier que /bin/sh est un "sane shell". Si ce n'est pas le cas, il essaie de ré-exécuter le script avec ksh . Si cela échoue, il lève les bras et affiche un message d'erreur.

Que vérifie-t-il exactement ? En particulier, que fait if false ^ printf et pourquoi ne se déclenche-t-il que dans les anciens shells ? Les anciens obus disposaient-ils d'un opérateur XOR, ou quoi ?

#!/bin/sh
# ...
# check that we have something mildly sane as our shell, or try to find something better
if false ^ printf "%s: WARNING: ancient shell, hunting for a more modern one... " "$0"
then
  SANE_SH=${SANE_SH:-/usr/bin/ksh}
  if printf 'true ^ false\n' | "$SANE_SH"
  then
    printf "'%s' seems viable.\n" "$SANE_SH"
    exec "$SANE_SH" "$0" "$@"
  else
    cat <<-EOF
        oh dear.

          If you have a more recent shell available, that supports \$(...) etc.
          please try setting the environment variable SANE_SH to the path of that
          shell, and then retry running this script. If that works, please report
          a bug describing your setup, and the shell you used to make it work.

        EOF
    printf "%s: ERROR: Less dimwitted shell required.\n" "$0"
    exit 1
  fi
fi

21voto

Charles Duffy Points 34134

Bourne original soutenu ^ comme opérateur de tuyau. Ceci a été abandonné dans l'interpréteur de commandes Korn (dont la spécification POSIX sh est dérivée), et est donc une fonctionnalité disponible dans Bourne mais pas dans POSIX sh.

Ainsi, ce code teste les shells Bourne pré-POSIX.

12voto

jlliagre Points 9325

Cette partie est là pour que le script fonctionne sur Solaris 10 et plus ancien où /bin/sh n'est pas conforme à POSIX. Notez que ce dernier point n'est pas un bogue, car POSIX ne spécifie pas ce qu'il faut faire pour être conforme à POSIX. sh Le chemin devrait être.

/bin/sh (et /sbin/sh ) sur Solaris 10 sont probablement les seuls interpréteurs de commandes restants dans les systèmes d'exploitation actuels qui prennent encore en charge cette forme de tube apparue dans l'interpréteur de commandes Bourne original.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X