перенаправление вывода команды с использованием '- <<(…)'

10

Мне нужно было извлечь шазум. Это работает, но кто-нибудь может объяснить, почему?

sed 's/^.*= //' -< <(openssl dgst -sha256 filename)

Я знаком с $( )конструкцией, но не могу найти документы для <( ), в сочетании с -<которыми, я полагаю, перенаправляет на sedSTDIN.

Я знаю, что есть более простые способы, но эта конструкция ускользает от меня.

GlenH
источник

Ответы:

10

<(openssl dgst -sha256 filename)

Конструкция - это процесс подстановки . Он создает файл (или FIFO) за кулисами и передает свое имя обратно в последовательность команд.

< 

это обычное перенаправление файлов, перенаправляющее содержимое закулисного файла в stdinи

-

является заполнителем, распознанным sedдля указания того, что его входные данные поступают из stdin.

Поскольку sedон вполне способен читать из файлов, -<в этом контексте он кажется ненужным;

sed 's/^.*= //' <(openssl dgst -sha256 filename)

должно работать так же хорошо.

steeldriver
источник
3
или простоopenssl ... | sed '...'
Майлз
8

Конструкция <( COMMAND )Bash называется заменой процесса .

Он оценивает COMMANDвнутреннюю часть и перенаправляет свой вывод в FIFO, именованный канал, который получает назначенный виртуальный дескриптор файла /dev/fd. Он действует как временный файл, который содержит выходные данные оцененной команды.


Конструкция <Bash называется перенаправлением ввода .

Он берет файловый дескриптор с правой стороны и перенаправляет его содержимое на стандартный ввод команды слева.


Это -не конструкция Bash, а аргумент,sed который определяет его входной файл. Специальное значение -означает чтение из STDIN (что также является sedзначением по умолчанию, поэтому его можно опустить).


sed 's/^.*= //' - < <(openssl dgst -sha256 filename)

Эта строка сначала запускается openssl dgst -sha256 filenameи кэширует свой вывод в FIFO. Дескриптор файла, представляющий этот именованный канал, обрабатывается как входной файл, который перенаправляется на STDIN sed 's/^.*= //' -. Эта sedкоманда читает из STDIN и удаляет каждый символ перед символом «=», за которым следует пробел.

Byte Commander
источник