Следующие примеры показывают, что новая строка добавляется в строку here .
Почему это сделано?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
источник
Следующие примеры показывают, что новая строка добавляется в строку here .
Почему это сделано?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
Простой ответ заключается в том, что 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
генерируется ненулевой код состояния, когда он встречает строку без перевода строки:источник
Я думаю, что это единственный способ получить новую строку в конце строки, доказательство:
Может показаться, что оператор here-string удаляет символы новой строки, если они не указаны в предоставленном вами синтаксисе.
источник
xxd <<<$(echo a)
.