сравнить
echo -n "bar"
с
echo "bar" -n
Первый делает то, что, как я думаю, должен делать (печатает «бар» без новой строки), а второй - нет. Это ошибка или по замыслу? Почему он отличается от многих программ Cli в том, что вы не можете перемещать опции? Например, tail -f /var/log/messages
это точно так же, как tail /var/log/messages -f
. Я иногда делаю последнее, когда забываю, что хотел первое, потому что внутренне параметры и аргументы переставляются, обычно с помощью getopt .
Обновление: да, я изначально не ответил на мой вопрос. Я убрал нерфа, вам придется просматривать историю, чтобы некоторые ответы имели смысл.
command-line
xenoterracide
источник
источник
echo -n "bar"
дает "бар", в то время какecho "bar" -n
дает "бар-н"Ответы:
Как заметили большинство других, «-n» интерпретируется буквально, если размещено где-нибудь, но сразу после
echo
команды.Исторически UNIX-утилиты были такими: они искали параметры только сразу после имени команды. Вероятно, либо BSD, либо GNU стали первыми в более гибком стиле (хотя я могу ошибаться), так как даже сейчас POSIX указывает старый способ как правильный (см. Рекомендацию 9, а также
man 3 getopt
в системе Linux). В любом случае, хотя большинство утилит Linux в наши дни используют новый стиль, есть некоторые несогласныеecho
.Echo
Это беспорядок, связанный со стандартами, поскольку к моменту появления POSIX в игре было по крайней мере две принципиально противоречивые версии . С одной стороны, у вас есть стиль SYSV, который интерпретирует символы с обратной косой чертой, но в остальном обрабатывает свои аргументы буквально, не принимая никаких опций. С другой стороны, у вас есть BSD-стиль, который рассматривает инициал-n
как особый случай и выводит буквально все остальное. А посколькуecho
это так удобно, у вас есть тысячи сценариев оболочки, которые зависят от того или иного поведения:Из-за семантики «относиться ко всему буквально» невозможно даже добавить новую опцию,
echo
не ломая вещи. Если бы GNU использовала гибкую схему опций, ад был бы свободен.Кстати, для лучшей совместимости между реализациями оболочки Bourne используйте
printf
вместоecho
.ОБНОВЛЕНО, чтобы объяснить, почему,
echo
в частности, не используются гибкие параметры.источник
POSIXLY_CORRECT
.echo
есть также реализации, которые распознают-e
или-E
как опции. Для переносимости, не начинайте с-
или используйте что-то вродеprintf %s -e
.Другие ответы доходят до того, что вы можете заглянуть на страницу справочника, чтобы увидеть, что -n становится частью строки для вывода. Однако я просто хочу отметить, что это легко исследовать без md5sum и делает происходящее немного менее загадочным.
источник
Вау, все объяснения длинны.
Это так просто:
-n
это опция, если она появляется перед строкой, в противном случае это просто еще одна строка, которую нужно отобразить.Удалите,
| md5sum
и вы увидите, что результат отличается.источник
Из простого осмотра, это не ошибка по замыслу ...
Попробуйте эту команду для себя:
Вы заметите, что в результате md5
Вы просто перепутали использование -n в эхо.
В вашем первом примере кода
-n используется, чтобы сказать НЕ ставить новую строку после этого эха.
Ваш второй образец
трактует -n как буквальный текст.
источник