Jak zauważyło większość innych, „-n” jest interpretowane dosłownie, jeśli jest umieszczone gdziekolwiek, ale bezpośrednio po echo
poleceniu.
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 getopt
w systemie Linux). W każdym razie, chociaż większość narzędzi Linuksa używa obecnie nowego stylu, istnieją pewne ograniczenia echo
.
Echo
to 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ł -n
jako specjalny przypadek i generuje absolutnie wszystko inne dosłownie. A ponieważ echo
jest 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 echo
bez 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 printf
raczej niżecho
.
ZAKTUALIZOWANO, aby wyjaśnić, dlaczego echo
w szczególności nie używa elastycznych opcji.
echo -n "bar"
daje „echo "bar" -n