Ответы:
Простой ответ заключается в том, что ksh написан именно так (а bash совместим). Но есть причина такого выбора дизайна.
Большинство команд ожидают ввода текста. В мире Unix текстовый файл состоит из последовательности строк, каждая из которых заканчивается новой строкой . Так что в большинстве случаев требуется заключительный перевод строки. Особенно распространенным случаем является получение выходных данных команды с помощью команды susbtitution, ее обработка каким-либо образом, а затем передача другой команде. Подстановка команд удаляет последние символы новой строки; <<<
ставит один обратно.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash и ksh не могут манипулировать двоичными данными в любом случае (они не справляются с нулевыми символами), поэтому неудивительно, что их средства ориентированы на текстовые данные.
<<<
Синтаксис здесь строка в основном только для удобства в любом случае, как <<
здесь-документов. Если вам не нужно добавлять заключительный перевод строки, используйте echo -n
(в bash) или printf
и конвейер.
<<<
был представлен миру Борна zsh
, нет ksh
. И это было вдохновлено аналогичным оператором в порту Unix, rc
который не добавил этот дополнительный символ новой строки. Интересно, что =(<<<text)
оператор не добавляет эту новую строку в zsh
.
printf
, и т. Д.), Избегая хвостовой строки bash
? Как @ StéphaneChazelas указал, возможно в zsh
.
Один сценарий, в котором целесообразно добавлять символы новой строки к строкам здесь, - это использование 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'
Я думаю, что это единственный способ получить новую строку в конце строки, доказательство:
xxd <<<`echo -ne "a\n"`
Может показаться, что оператор here-string удаляет символы новой строки, если они не указаны в предоставленном вами синтаксисе.
xxd <<<$(echo a)
.