使用'-< <( ... )'的命令输出重定向

Gle*_*enH 12 bash redirect syntax

我需要提取一个shasum。这有效,但谁能解释为什么?

sed 's/^.*= //' -< <(openssl dgst -sha256 filename)
Run Code Online (Sandbox Code Playgroud)

我熟悉这个$( )构造,但找不到<( ),加上 的文档-<,我认为它正在重定向到标准输入sed

我知道有更简单的方法,但这种结构让我望而却步。

ste*_*ver 12

<(openssl dgst -sha256 filename)
Run Code Online (Sandbox Code Playgroud)

构造是一个过程替换。它在幕后创建一个文件(或 FIFO)并将其名称传递回命令序列。

< 
Run Code Online (Sandbox Code Playgroud)

是常规文件重定向,将幕后文件的内容重定向到stdin

-
Run Code Online (Sandbox Code Playgroud)

是由 识别的占位符sed,表示其输入来自stdin

由于sed完全能够从文件中读取,因此-<在这种情况下似乎没有必要;

sed 's/^.*= //' <(openssl dgst -sha256 filename)
Run Code Online (Sandbox Code Playgroud)

应该也能正常工作。

  • 或者只是`openssl ... | sed '...'` (3认同)

Byt*_*der 9

<( COMMAND )击构建体被称为进程替换

它评估COMMAND内部并将其输出重定向到一个 FIFO,一个命名管道,它在内部/dev/fd分配一个虚拟文件描述符。它就像一个包含评估命令输出的临时文件。


<猛砸结构被称为输入重定向

它在右侧接受一个文件描述符,并将其内容重定向到左侧命令的 STDIN(标准输入)。


-不是猛砸构建而是为参数sed,指定其输入文件。特殊值-意味着从 STDIN 读取(这也是sed的默认值,因此可以省略)。


sed 's/^.*= //' - < <(openssl dgst -sha256 filename)
Run Code Online (Sandbox Code Playgroud)

该行首先运行openssl dgst -sha256 filename并将其输出缓存在 FIFO 中。表示此命名管道的文件描述符被视为输入文件,该文件被重定向到sed 's/^.*= //' -. 此sed命令从 STDIN 读取并删除“=”符号之前的每个字符,后跟一个空格。