Перенаправление вывода команды с использованием '-<<(...)'
Мне нужно было извлечь шазум. Это работает, но кто-нибудь может объяснить, почему?
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 и удаляет каждый символ перед символом "=", за которым следует пробел.