Come molti altri hanno osservato, "-n" viene interpretato letteralmente se posizionato ovunque ma immediatamente dopo il echocomando.
Storicamente, le utility UNIX erano tutte così: cercavano opzioni solo immediatamente dopo il nome del comando. Probabilmente era BSD o GNU che ha aperto la strada allo stile più flessibile (anche se potrei sbagliarmi), poiché anche ora POSIX specifica il vecchio modo come corretto (vedere la Linea guida 9 e anche man 3 getoptsu un sistema Linux). Comunque, anche se la maggior parte dei programmi di utilità Linux in questi giorni usa il nuovo stile, ci sono alcuni aspetti positivi echo.
Echoè un disastro, dal punto di vista degli standard, in quanto c'erano almeno due versioni fondamentalmente in conflitto al momento della creazione di POSIX. Da un lato, hai lo stile SYSV, che interpreta i caratteri con escape backslash ma che tratta gli argomenti in modo letterale, senza accettare alcuna opzione. Dall'altro, hai lo stile BSD, che tratta un'iniziale -ncome un caso speciale e produce letteralmente tutto il resto. E poiché echoè così conveniente, hai migliaia di script di shell che dipendono da un comportamento o dall'altro:
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! --
A causa della semantica "tratta tutto alla lettera", è impossibile persino aggiungere una nuova opzione echosenza rompere le cose. Se GNU usasse lo schema di opzioni flessibili su di esso, l'inferno si scatenerà.
Per inciso, per la migliore compatibilità tra le implementazioni della shell Bourne, utilizzare printfanzichéecho .
AGGIORNATO per spiegare perché, echoin particolare, non utilizza opzioni flessibili.
echo -n "bar"dà "bar", mentreecho "bar" -ndà "bar -n"