我需要提取 shasum。这可行,但有人能解释一下原因吗?
sed 's/^.*= //' -< <(openssl dgst -sha256 filename)
我熟悉该$( )
构造,但找不到 的文档<( )
,再加上-<
,我认为这是重定向到sed
STDIN。
我知道有更简单的方法,但是这种构造让我难以理解。
答案1
这
<(openssl dgst -sha256 filename)
构造是一个流程替代它在后台创建一个文件(或 FIFO)并将其名称传回命令序列。
<
是常规文件重定向,将后台文件的内容重定向stdin
到
-
是一个可识别的占位符,sed
表示其输入来自stdin
。
由于sed
完全能够从文件中读取,因此-<
在这种情况下似乎是不必要的;
sed 's/^.*= //' <(openssl dgst -sha256 filename)
应该同样有效。
答案2
Bash<( COMMAND )
结构被称为流程替代。
它评估COMMAND
内部情况,并将其输出重定向到 FIFO,这是一个命名管道,内部/dev/fd
分配有虚拟文件描述符。它的作用类似于包含评估命令输出的临时文件。
Bash<
结构被称为输入重定向。
它获取右侧的文件描述符并将其内容重定向到左侧命令的 STDIN(标准输入)。
不是-
一个 Bash 构造,而是一个论据sed
指定其输入文件。特殊值-
意味着从 STDIN 读取(这也是sed
的默认值,因此可以省略)。
sed 's/^.*= //' - < <(openssl dgst -sha256 filename)
此行首先运行openssl dgst -sha256 filename
并将其输出缓存在 FIFO 中。表示此命名管道的文件描述符被视为输入文件,该文件将重定向到 的 STDIN sed 's/^.*= //' -
。此sed
命令从 STDIN 读取并删除“=”符号后跟空格之前的每个字符。