Como a maioria dos outros observou, "-n" é interpretado literalmente se colocado em qualquer lugar, mas imediatamente após o comando echo
.
Historicamente, os utilitários UNIX eram todos assim - eles procuravam opções apenas imediatamente após o nome do comando. Era provável que o BSD ou o GNU tivessem sido pioneiros no estilo mais flexível (embora eu possa estar errado), como até agora POSIX especifica a maneira antiga como correta (consulte a Diretriz 9 e também man 3 getopt
em um sistema Linux). De qualquer forma, mesmo que a maioria dos utilitários Linux usem o novo estilo, existem alguns itens como echo
.
Echo
é uma bagunça, segundo os padrões, em que havia pelo menos dois fundamentalmente versões conflitantes em jogo no momento em que POSIX surgiu. Por um lado, você tem estilo SYSV, que interpreta caracteres com escape de barra invertida, mas, de outra forma, trata seus argumentos literalmente, não aceitando opções. Por outro lado, você tem o estilo BSD, que trata um -n
inicial como um caso especial e produz literalmente todo o resto. E como echo
é tão conveniente, você tem milhares de scripts de shell que dependem de um comportamento ou outro:
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! --
Por causa da semântica do "tratar tudo literalmente", é impossível adicionar uma nova opção ao echo
sem quebrar as coisas. Se o GNU usasse o esquema de opções flexíveis, o inferno iria se soltar.
Incidentalmente, para melhor compatibilidade entre as implementações do shell Bourne, use printf
em vez de echo
.
ATUALIZADO para explicar por que echo
em particular não usa opções flexíveis.