$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)
似乎有多个标准输入,但是-如果我没记错我的Linux Porgramming课程-那就不可能了。我认为,按照定义,标准输入是一个流。
也许这与标准输入有关?谁可以给我解释一下这个; 也许提供文档链接。
好处:脚本将如何处理这些多个流?如果有人可以提供Python或Perl示例,那将非常有帮助。
<(…)
; 在Zsh进程中,替换语法为=(…)
。
$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)
似乎有多个标准输入,但是-如果我没记错我的Linux Porgramming课程-那就不可能了。我认为,按照定义,标准输入是一个流。
也许这与标准输入有关?谁可以给我解释一下这个; 也许提供文档链接。
好处:脚本将如何处理这些多个流?如果有人可以提供Python或Perl示例,那将非常有帮助。
<(…)
; 在Zsh进程中,替换语法为=(…)
。
Answers:
这不是多个标准输入。这是一种bash主义,称为“过程替代”,http://tldp.org/LDP/abs/html/process-sub.html
它/dev/fd/something
为每个替换创建一个伪文件()。非常有用 该命令只能作为流读取,这意味着它不能与fseek来回移动。它需要像管道一样将其读取为字节流。
奖励答案
您不需要做太多就可以使用它。就您的脚本而言,它会在命令行上获取一个有效的文件名,该文件名可以像其他任何文件一样打开()。正如其他人所说,您会看到的diff /dev/fd/XX /dev/fd/YY
。如果对这些伪文件中的任何一个执行stat(),都会看到它是一个命名管道,并且应该使用管道语义来对待它-即没有fseek()或ftell()。如果您执行stat()测试以明确查看它是否是文件(例如[ -f $1 ]
),则该文件将中断-毕竟这是作为命名管道实现的。
<(...)
在bash 中处理替换。paren中进程的输出被发送到正常3以外的其他文件描述符,并返回与该文件描述符相对应的文件名。这样,命令的输出可以被视为要传递给另一个命令的文件名。
每个过程都有一个stdin
和一个。它们通常连接到终端,但是可以相互重定向。stdout
在该示例中,wget
涉及两个过程,每个过程都有自己的stdin
和stdout
。每个wget
进程写入-
,这是它stdout
。然后bash
的流程替换<(...)
将流程的连接stdout
到唯一的伪文件,该文件diff
可以读取。请注意,这两个进程替换会产生两个不同的伪文件!因此,diff
看到如下内容:
diff /dev/fd/XX /dev/fd/YY
其中stdout
的wget -q -O - URL1
连接到/dev/fd/XX
,和所述stdout
的wget -q -O - URL2
给/dev/fd/YY
。