Відповіді:
Відповідь проста, тому що ksh написано саме так (і bash сумісний). Але є вибір такого дизайну.
Більшість команд очікують введення тексту. У світі Unix текстовий файл складається з послідовності рядків, кожен з яких закінчується новим рядком . Тому в більшості випадків потрібна остаточна нова лінія. Особливо поширений випадок - це схопити вихід команди з підпорядкуванням команди, обробити його певним чином, а потім передати його іншій команді. Заміна команди знімає заключні нові рядки; <<<
кладе одну спину.
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"`
Здається, що оператор тут-рядка знімає нові рядки, якщо вони не вказані у представленому вами синтаксисі.
xxd <<<$(echo a)
.