Командная строка: <<< вместо <<

63

Почему команда md5sum <<< 'ddd' (output:) d6d88f2e50080b9602da53dac1102762 -верна, а md5sum << 'ddd'нет?

Что <<<значит?

Жан Паулюс
источник

Ответы:

45

В <<<Запускает «здесь строка»: строка раскрывается и подается на стандартный ввод программы. (В вашем случае не так много расширений.) Это эквивалентно следующему:

echo ddd | md5sum

С другой стороны, <<начинается здесь документ. Все последующие строки, вплоть до одной, содержащей маркер, dddбудут содержать ввод программы. (Вы должны использовать маркер, который вряд ли появится в ваших данных.) Вы можете достичь того же эффекта, что и выше, например:

md5sum <<END
ddd
END

Существует одно различие между <<ENDи <<'END': без кавычек любые переменные, escape-последовательности и т. Д. В этом документе будут расширены как обычно.

chirlu
источник
3
Где это не эквивалентно, это то, что, кроме как rc, <<<(вроде <<) использует временный файл, поэтому может использоваться командами, которые lseekих stdin.
Стефан Шазелас
32

<<<вводит строку здесь : строка после <<<передается в качестве ввода в команду. Это происходит из порта Байрона Ракициса rc(оболочка Plan 9) в Unix, а также присутствует в zsh, ksh93 и bash.

<<представляет здесь документ : последующие строки сценария оболочки передаются в качестве входных данных для команды, а строка после <<является терминатором. Здесь документы работают во всех оболочках в стиле Борна (Bourne, POSIX, ash, bash, ksh, zsh,…), в оболочках в стиле C (csh, tcsh) и в оболочках Plan 9 (rc, es).

Жиль "ТАК - перестань быть злым"
источник
3
Нет, <<<не является kshрасширением, путь rc-> zsh-> ksh93-> bash( kshпримечания к выпуску подтверждаются для однократного заимствования функции zsh). <<также работает в rcстиле снарядов
Стефан Шазелас
Есть разница между rcи, zsh <<<хотя в этом rcнет заключительного символа новой строки и не используется временный файл (используется канал и дополнительный процесс, подающий его, по крайней мере, в порт Linux).
Стефан Шазелас
Чтобы быть более точным, похоже, что он <<<поступает из порта Unix, rcпоскольку он не похож на Plan9 rc.
Стефан Шазелас