Como la mayoría de los demás han observado, "-n" se interpreta literalmente si se coloca en cualquier lugar pero inmediatamente después del echocomando.
Históricamente, las utilidades de UNIX eran así: buscaban opciones solo inmediatamente después del nombre del comando. Probablemente, BSD o GNU fueron los pioneros del estilo más flexible (aunque podría estar equivocado), ya que incluso ahora POSIX especifica la forma antigua como correcta (consulte la Directriz 9, y también man 3 getopten un sistema Linux). De todos modos, a pesar de que la mayoría de las utilidades de Linux en estos días usan el nuevo estilo, hay algunas reservas como echo.
Echoes un desastre, en cuanto a estándares, en el sentido de que había al menos dos versiones fundamentalmente conflictivas en juego cuando POSIX surgió. Por un lado, tiene el estilo SYSV, que interpreta los caracteres con barra invertida pero trata sus argumentos literalmente, sin aceptar opciones. Por otro lado, tiene un estilo BSD, que trata una inicial -ncomo un caso especial y genera absolutamente todo lo demás literalmente. Y como echoes tan conveniente, tiene miles de scripts de shell que dependen de un comportamiento u otro:
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! --
Debido a la semántica de "tratar todo literalmente", es imposible incluso agregar una nueva opción echosin romper las cosas. Si GNU usara el esquema de opciones flexibles, el infierno se desataría.
Por cierto, para una mejor compatibilidad entre las implementaciones de shell Bourne, use en printflugar deecho .
ACTUALIZADO para explicar por qué echoen particular no utiliza opciones flexibles.
echo -n "bar"da "bar", mientrasecho "bar" -nda "bar -n"