Jak zauważyło większość innych, „-n” jest interpretowane dosłownie, jeśli jest umieszczone gdziekolwiek, ale bezpośrednio po echopoleceniu.
Dawniej wszystkie narzędzia UNIX były takie - szukały opcji dopiero bezpośrednio po nazwie polecenia. Prawdopodobnie BSD lub GNU były pionierami bardziej elastycznego stylu (choć mogę się mylić), ponieważ nawet teraz POSIX określa stary sposób jako poprawny (patrz Wytyczna 9, a także man 3 getoptw systemie Linux). W każdym razie, chociaż większość narzędzi Linuksa używa obecnie nowego stylu, istnieją pewne ograniczenia echo.
Echoto bałagan, pod względem standardów, ponieważ istniały co najmniej dwie zasadniczo sprzeczne wersje, zanim powstało POSIX. Z jednej strony masz styl SYSV, który interpretuje znaki z odwrotnym ukośnikiem, ale poza tym traktuje argumenty dosłownie, nie akceptując żadnych opcji. Z drugiej strony masz styl BSD, który traktuje inicjał -njako specjalny przypadek i generuje absolutnie wszystko inne dosłownie. A ponieważ echojest to wygodne, masz tysiące skryptów powłoki, które zależą od jednego lub drugiego zachowania:
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! --
Z powodu semantycznego „traktuj wszystko dosłownie” nie można nawet dodać nowej opcji echobez zepsucia rzeczy. Gdyby GNU użył na nim schematu elastycznych opcji, piekło rozpętałoby się.
Nawiasem mówiąc, dla najlepszej kompatybilności pomiędzy implementacjami powłoki Bourne'a, użyj printfraczej niżecho .
ZAKTUALIZOWANO, aby wyjaśnić, dlaczego echow szczególności nie używa elastycznych opcji.
echo -n "bar"daje „echo "bar" -n