0

如果我执行以下命令:

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

和:

> echo $someVariable

结果是:54

(带空格)有什么< <作用?

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

上面的命令只是示例。

非常感谢

4

1 回答 1

1

进程替换

正如tldp.org解释的那样,

进程替换将一个进程(或多个进程)的输出馈送到另一个进程的标准输入中。

所以实际上这类似于将一个命令的标准输出管道传输到另一个命令,例如echo foobar barfoo | wc。但请注意:在 [bash 手册页][3] 中,您会看到它被表示为<(list). 所以基本上你可以重定向多个(!)命令的输出。

注意:从技术上讲,当您说 < < 时,您指的不是一件事,而是使用单个 < 的两个重定向和来自 <( . . .) 的输出的过程重定向。

现在如果我们只处理替换会发生什么?

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

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

因此,非常简单的示例是将两个 echo 命令的输出进程替换为 wc:

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

所以在这里我们让 shell 为括号中发生的所有输出创建一个文件描述符,并将其作为输入重定向到 wc 。正如预期的那样, wc 从两个 echo 命令接收该流,这两个命令本身会输出两行,每行都有一个单词,并且我们有 2 个单词、2 行和 6 个字符加上两个换行符。

旁注:进程替换可能被称为 bashism(可在 bash 等高级 shell 中使用的命令或结构,但 POSIX 未指定),但在 bash 作为 ksh 手册页存在之前,它已在 ksh实现。Shell 喜欢tcshmksh没有进程替换。那么我们如何在没有进程替换的情况下将多个命令的输出重定向到另一个命令呢?分组加管道!

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

实际上,这与上面的示例相同,但是,这与进程替换在本质上是不同的,因为我们制作了整个子 shell 的标准输出和wc[与管道链接][5] 的标准输入。另一方面,进程替换使命令读取临时文件描述符。

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

diff <(ls /bin) <(ls /usr/bin)
于 2019-02-24T05:56:51.260 回答