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)
应该也能正常工作。
该<( 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 读取并删除“=”符号之前的每个字符,后跟一个空格。