使用'-<<(…)'进行命令输出重定向


10

我需要提取阴影。这可行,但是谁能解释原因?

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

我很熟悉的$( )概念,但是无法找到文档<( ),再加上-<,我以为被重定向到sedSTDIN。

我知道有更简单的方法,但是这种构造使我难以理解。

Answers:


10

<(openssl dgst -sha256 filename)

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

< 

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

-

是占位符sed,表示为,表示其输入来自stdin

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

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

应该也一样。


3
或只是openssl ... | sed '...'
迈尔斯

8

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

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


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

它在右侧使用文件描述符,然后将其内容重定向到左侧命令的STDIN(标准输入)。


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


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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.