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 echocommande.
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 getoptsur 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 comme echo.
Echoest 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 -ncomme un cas spécial et sort absolument tout le reste littéralement. Et comme echoc'est si pratique, vous avez des milliers de scripts shell qui dépendent d'un comportement ou de l'autre:
echo Usage: my_awesome_script '[-a]' '[-b]' '[-c]' '[-n]'
echo -a does a thing.
echo -b does something else.
echo -c makes sure -a works right.
echo -- DON\'T USE -n -- it\'s not finished! --
En raison de la sémantique "traiter tout littéralement", il est impossible même d'ajouter une nouvelle option echosans 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 printfplutôt queecho .
MIS À JOUR pour expliquer pourquoi echoen particulier n'utilise pas d'options flexibles.
echo -n "bar"donne "bar", tandis queecho "bar" -ndonne "bar -n"