使用重定向操作符的Bash命令“读取”行为

时间:2019-02-24 04:19:57

标签: linux bash process-substitution

如果我执行以下命令:

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

和:

> echo $someVariable

结果是:54

< <(带空格)会做什么?

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

以上命令仅是示例。

非常感谢

1 个答案:

答案 0 :(得分:2)

流程替代

tldp.org所述,

  

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

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

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

现在,如果仅进行处理替换会发生什么?

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

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

一个非常简单的例子是将两个回显命令的输出替换为wc:

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

因此,在这里我们使shell为括号中出现的所有输出创建一个文件描述符,并将其重定向为wc的输入。正如预期的那样,wc从两个echo命令接收该流,后者本身将输出两行,每行有一个单词,并且适当地,我们有2个单词,2行和6个字符加上两个换行符。

附带说明:进程替换可以称为bashism(在bash之类的高级shell中可用的命令或结构,但未由POSIX指定),但它是在bash存在之前在ksh中实现的为ksh man page。像tcshmksh这样的Shell没有进程替代。那么,如何在不进行进程替换的情况下将多个命令的输出重定向到另一个命令呢?分组加上管道!

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

实际上,这与上面的示例相同,但是,这与进程替换完全不同,因为我们将整个wc的子外壳和stdin的stdout [与管道链接] [5]制成。另一方面,进程替换使命令读取临时文件描述符。

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

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