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

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

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

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

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

2 ответа

Решение

<(openssl dgst -sha256 filename)

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

< 

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

-

заполнитель признан sed чтобы указать, что его вклад исходит от stdin,

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

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

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

<( 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 и удаляет каждый символ перед символом "=", за которым следует пробел.

Другие вопросы по тегам