Comparer
echo -n "bar"
avec
echo "bar" -n
Le premier fait ce que je pense qu'il est censé faire (imprime "bar" sans nouvelle ligne), tandis que le second ne le fait pas. Est-ce un bug ou par conception? Pourquoi est-il différent de nombreux programmes cli en ce sens que vous ne pouvez pas déplacer les options? Par exemple, tail -f /var/log/messages
est exactement le même que tail /var/log/messages -f
. Je fais parfois ce dernier quand j'oublie que je voulais le premier, car en interne les options et les arguments sont réorganisés, généralement par getopt .
Mise à jour: oui, j'ai initialement nerf-ed ma question. J'ai supprimé le nerf que vous devrez consulter l'historique pour donner un sens à certaines des réponses.
command-line
xénoterracide
la source
la source
echo -n "bar"
donne "bar", tandis queecho "bar" -n
donne "bar -n"Réponses:
Comme la plupart des autres l'ont observé, "-n" est interprété littéralement s'il est placé n'importe où mais immédiatement après la
echo
commande.Historiquement, les utilitaires UNIX étaient tous comme ça - ils ne cherchaient des options qu'immédiatement après le nom de la commande. C'est probablement BSD ou GNU qui a été le pionnier du style plus flexible (bien que je puisse me tromper), car même maintenant POSIX spécifie l'ancienne méthode comme correcte (voir la directive 9, et également
man 3 getopt
sur un système Linux). Quoi qu'il en soit, même si la plupart des utilitaires Linux utilisent de nos jours le nouveau style, il y a des réticences commeecho
.Echo
est un gâchis, du point de vue des normes, en ce sens qu'il y avait au moins deux versions fondamentalement conflictuelles en jeu au moment de la création de POSIX. D'une part, vous avez le style SYSV, qui interprète les caractères d'échappement antislash mais traite autrement ses arguments littéralement, n'acceptant aucune option. De l'autre, vous avez le style BSD, qui traite une initiale-n
comme un cas spécial et sort absolument tout le reste littéralement. Et commeecho
c'est si pratique, vous avez des milliers de scripts shell qui dépendent d'un comportement ou de l'autre:En raison de la sémantique "traiter tout littéralement", il est impossible même d'ajouter une nouvelle option
echo
sans casser les choses. Si GNU utilisait le schéma d'options flexibles, l'enfer se déchaînerait.Par ailleurs, pour une meilleure compatibilité entre les implémentations du shell Bourne, utilisez
printf
plutôt queecho
.MIS À JOUR pour expliquer pourquoi
echo
en particulier n'utilise pas d'options flexibles.la source
POSIXLY_CORRECT
echo
, il existe également des implémentations qui reconnaissent-e
ou-E
comme options. Pour la portabilité, ne commencez pas par un-
ou n'utilisez pas quelque chose commeprintf %s -e
.Les autres réponses arrivent au point que vous pouvez consulter la page de manuel pour voir que -n devient une partie de la chaîne à faire écho. Cependant, je veux juste souligner qu'il est facile d'enquêter sans le md5sum et rend ce qui se passe un peu moins cryptique.
la source
Wow, les explications de tout le monde sont longues.
C'est aussi simple que cela:
-n
est une option si elle apparaît avant la chaîne, sinon c'est juste une autre chaîne à faire écho.Supprimez le
| md5sum
et vous verrez que la sortie est différente.la source
De simple inspection, ce n'est pas un bug par conception ...
Essayez cette commande par vous-même:
Vous remarquerez que le md5 résultant est
Vous venez de mélanger l'utilisation de -n dans l'écho.
Dans votre premier exemple de code
-n est utilisé pour dire NE PAS mettre de nouvelle ligne après cet écho.
Votre deuxième échantillon
traite -n comme un texte littéral.
la source