Легкий ответ - то, потому что ksh записан тот путь (и удар совместим). Но существует причина того проектного решения.
Большинство команд ожидает ввод текста. В мире Unix текстовый файл состоит из последовательности строк, каждый заканчивающийся в новой строке. Таким образом, в большинстве случаев заключительная новая строка требуется. Особенно общий падеж должен захватить вывод команды с командой susbtitution, обработать его в некотором роде, затем передать его другой команде. Замена команды разделяет заключительные новые строки; <<<
откладывает тот.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash и ksh не могут управлять двоичными данными так или иначе (он не может справиться с нулевыми символами), таким образом, не удивительно, что их средства снабжены приводом к текстовым данным.
<<<
здесь-строковый синтаксис главным образом только для удобства так или иначе, как <<
здесь-документы. Если Вы не должны добавлять заключительную новую строку, использовать echo -n
(в ударе) или printf
и конвейер.
Я думаю, что это - единственный способ получить новую строку в конце здесь-строки, доказательства:
xxd <<<`echo -ne "a\n"`
Казалось бы, что здесь-строковый-оператор разделяет новые строки, если им не дают в синтаксисе, Вы отправили.
xxd <<<$(echo a)
. Спасибо Gilles
– Gilles 'SO- stop being evil'
06.09.2011, 03:11
Один из сценариев, в котором практично добавлять новые строки к строкам here, - это использование команды read
при активном режиме set -e
. Напомним, что set -e
заставляет сценарий завершать работу, когда он (более или менее) сталкивается с утверждениями, генерирующими ненулевой код состояния. Рассмотрим, что read
генерирует ненулевой код состояния, когда встречает строку без новых строк:
#!/bin/bash
set -e
# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'
# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'
<<<
был представлен миру Bournezsh
, нетksh
. И это было вдохновлено подобным оператором в порте Unixrc
который не добавил что дополнительный символ новой строки. Интересно,=(<<<text)
оператор не включает ту новую строкуzsh
. – Stéphane Chazelas 06.11.2015, 19:21