Bel*_*dez 40 linux script shell
从这个commandlinefu 帖子:
$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)
Run Code Online (Sandbox Code Playgroud)
看起来像多个标准输入但是——如果我没有记错我的 Linux Porgramming 课程——这不可能。我认为,根据定义,标准输入是一个流。
也许这与标准输入有关?谁可以给我解释一下这个; 也许提供指向文档的链接。
奖励:脚本将如何处理这些多个流?如果有人可以提供 Python 或 Perl 示例,那将非常有帮助。
Ric*_*lka 32
这不是多个标准输入。这是一种称为“进程替换”的 bash'ism http://tldp.org/LDP/abs/html/process-sub.html
它/dev/fd/something为每个替换创建一个伪文件 ( )。它非常有用。该命令只能作为流读取,这意味着它不能与 fseek 来回切换。它需要将它作为字节流来读取,就像管道一样。
奖金答案
你不需要做太多的事情来使用它。就您的脚本而言,它在命令行上获得一个有效的文件名,可以像其他任何东西一样 open()ed。正如其他人所说,你会看到diff /dev/fd/XX /dev/fd/YY。如果你对这些伪文件中的任何一个执行 stat(),你会看到它是一个命名管道,你应该用管道语义来对待它——即没有 fseek() 或 ftell()。如果您执行 stat() 测试以明确查看它是否是一个文件(例如[ -f $1 ]),这将破坏 - 毕竟这是作为命名管道实现的。
有一个stdin和一个stdout 为每个进程。它们通常连接到终端,但它们可以彼此分开重定向。
在该示例中,wget涉及两个进程,每个进程都有自己的stdin和stdout。每个wget进程都写入-,这是它的stdout. thenbash的进程替换<(...)将进程的连接stdout到一个唯一的伪文件,从中diff可以读取。请注意,两个进程替换产生两个不同的伪文件!因此,diff看到类似:
diff /dev/fd/XX /dev/fd/YY
Run Code Online (Sandbox Code Playgroud)
其中stdoutofwget -q -O - URL1连接到/dev/fd/XX,而stdoutof连接wget -q -O - URL2到/dev/fd/YY。
<(...)在 bash中进行进程替换。括号中进程的输出被发送到一个超出正常 3 的附加文件描述符,并返回与该文件描述符对应的文件名。通过这种方式,命令的输出可以被视为要传递给另一个命令的文件名。
| 归档时间: |
|
| 查看次数: |
13615 次 |
| 最近记录: |