Почему здесь-строка удара добавляет запаздывающий символ новой строки?

Вы могли также попробовать Карту GD, другой инструмент GUI на основе treemaps.

34
06.09.2011, 02:12
3 ответа

Легкий ответ - то, потому что ksh записан тот путь (и удар совместим). Но существует причина того проектного решения.

Большинство команд ожидает ввод текста. В мире Unix текстовый файл состоит из последовательности строк, каждый заканчивающийся в новой строке. Таким образом, в большинстве случаев заключительная новая строка требуется. Особенно общий падеж должен захватить вывод команды с командой susbtitution, обработать его в некотором роде, затем передать его другой команде. Замена команды разделяет заключительные новые строки; <<< откладывает тот.

tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp

Bash и ksh не могут управлять двоичными данными так или иначе (он не может справиться с нулевыми символами), таким образом, не удивительно, что их средства снабжены приводом к текстовым данным.

<<< здесь-строковый синтаксис главным образом только для удобства так или иначе, как << здесь-документы. Если Вы не должны добавлять заключительную новую строку, использовать echo -n (в ударе) или printf и конвейер.

38
27.01.2020, 19:37
  • 1
    Намного более полный, чем мой ответ. –  Mike 06.09.2011, 03:02
  • 2
    Bash, возможно, взял здесь-строки у ksh93, но ksh в свою очередь одолжил их у zsh, который получил их от дистанционного управления оболочки Плана 9. –  Mark Reed 08.01.2014, 00:04
  • 3
    <<< был представлен миру Bourne zsh, нет ksh. И это было вдохновлено подобным оператором в порте Unix rc который не добавил что дополнительный символ новой строки. Интересно, =(<<<text) оператор не включает ту новую строку zsh. –  Stéphane Chazelas 06.11.2015, 19:21
  • 4
    , Если Вы задаетесь вопросом об интересе к этому ответу, из-за этого вопроса в ТАК. авария спасибо –  fedorqui 09.06.2016, 17:41

Я думаю, что это - единственный способ получить новую строку в конце здесь-строки, доказательства:

xxd <<<`echo -ne "a\n"`

Казалось бы, что здесь-строковый-оператор разделяет новые строки, если им не дают в синтаксисе, Вы отправили.

-3
27.01.2020, 19:37
  • 1
    Это - замена команды, это разделяет заключительную новую строку. Вы могли упростить это до 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'
3
27.01.2020, 19:37

Теги

Похожие вопросы