Bash 命令"read"使用重定向运算符的行为



如果我执行以下命令:

> read someVariable _ < <(echo "54 41")

和:

> echo $someVariable

结果是:54

< <(带空格)做什么?

为什么_在" echo"命令中的结果中给出了第一个单词?

上面的命令只是示例。

非常感谢

过程替代

正如tldp.org所述,

流程替换将过程(或过程)的输出供应到 另一个过程的stdin。

因此,实际上,这类似于一个命令的管道,例如echo foobar barfoo | wc。但是请注意:在[bash manpage] [3]中,您会看到它表示为 <(list)。因此,基本上您可以重定向多个(!)命令的输出。

注意:从技术上讲,当您说&lt时;&lt;您不是指一件事,而是两个重定向single&lt;和从&lt;(。)的输出的过程重定向。

现在,如果我们进行替换会发生什么?

$ echo <(echo bar)
/dev/fd/63

您可以看到,Shell会创建临时文件描述符/dev/fd/63输出所在的位置。这意味着<将该文件描述符重定向为命令中的输入。

如此简单的示例就是将输出从两个回声命令替换为WC:

$ wc < <(echo bar;echo foo)
      2       2       8

因此,在这里,我们使Shell创建一个文件描述符,以适用于括号中发生的所有输出,并重定向将其作为WC的输入。有一个单词,并且适当地我们有2个单词,2行和6个字符以及两个新线。

附带注释:过程替换可以称为狂欢(在bash等高级壳中可用的命令或结构可用,但不是Posix指定的),但是它是在Bash存在之前在ksh中实现的作为KSH MAN页面。诸如tcshmksh之类的外壳没有进程替代。那么,我们如何在没有进程替代的情况下将多个命令的输出重定向到另一个命令呢?分组加管!

$ (echo foo;echo bar) | wc
      2       2       8

有效地,这与上述示例相同,但是,这与过程替换在引擎盖下是不同的,因为我们使wc的整个子壳和stdin [与管道链接] [5]。另一方面,过程替换使命令读取临时文件描述符。

因此,如果我们可以通过管道进行分组,为什么我们需要流程替代?因为有时我们不能使用管道。考虑下面的示例 - 将两个命令的输出与diff进行比较(其中需要两个文件,在这种情况下,我们给了两个文件描述符)

diff <(ls /bin) <(ls /usr/bin)