Як зауважили більшість інших, "-n" тлумачиться буквально, якщо його розміщують де-небудь, але відразу після echoкоманди.
Історично утиліти UNIX були такими - вони шукали параметри лише одразу після назви команди. Ймовірно, або BSD, або GNU запровадили більш гнучкий стиль (хоча я можу помилитися), оскільки навіть зараз POSIX визначає старий спосіб як правильний (див. Посібник 9, а також man 3 getoptу системі Linux). У будь-якому випадку, хоча сьогодні більшість утиліт Linux використовує новий стиль, є деякі захоплення echo.
Echoце безлад, стандартний, оскільки до моменту появи POSIX існували принаймні дві принципово суперечливі версії . З одного боку, у вас є стиль SYSV, який інтерпретує символи, що вийшли з косої риски, але в іншому випадку трактує його аргументи буквально, не приймаючи жодних варіантів. З іншого боку, у вас є BSD-стиль, який розглядає початкове -nяк окремий випадок і виводить абсолютно все реальне буквально. А оскільки echoце так зручно, у вас є тисячі скриптів оболонок, які залежать від тієї чи іншої поведінки:
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! --
Через семантичне «ставитись до всього буквально» неможливо навіть додати новий варіант, echoне порушуючи речі. Якби GNU використовувала схему гнучких варіантів на ній, пекло розривається.
До речі, для найкращої сумісності між реалізаціями оболонки Bourne скоріше використовуйтеprintfecho .
ОНОВЛЕНО, щоб пояснити, чому, echoзокрема, не використовуються гнучкі варіанти.
echo -n "bar"дає "бар", аecho "bar" -nдає "bar -n"