Bash 中的进程替换

Bash 中的进程替换

有人可以向我解释为什么我看不到以下命令中“date”的输出吗?对于 STDIN 输入的 N 个数字,它仅打印最后 (N-1) 个命令?

[root@RAJ-RHEL6 raj]# cat < <(date) <(hostname) <(uptime) <(cat /etc/resolv.conf)
RAJ-RHEL6.5
 02:22:59 up  2:36,  1 user,  load average: 0.00, 0.00, 0.00
nameserver 10.207.26.248
[root@RAJ-RHEL6 raj]#

答案1

您只能从一处重定向标准输入流。您不能指望能够从多个文件重定向它或在单个命令中处理替换。

命令

cat < <(date) <(hostname) <(uptime) <(cat /etc/resolv.conf)

是相同的

cat <(hostname) <(uptime) <(cat /etc/resolv.conf) < <(date)

即,您提供cat三个输入文件,然后将输出重定向date到其标准输入。

如果给定要使用的文件,该cat实用程序将不会使用其标准输入流,但您可以通过使用特殊文件名来使其这样做-

cat - <(hostname) <(uptime) <(cat /etc/resolv.conf) < <(date)

另请注意,最后一个进程替换是无用的,命令最好写为

cat - <(hostname) <(uptime) /etc/resolv.conf < <(date)

或者,如果没有 的输出重定向date,则为

cat <(date) <(hostname) <(uptime) /etc/resolv.conf

或者,通过单个命令替换,

cat <( date; hostname; uptime; cat /etc/resolv.conf )

或者,在没有过程替代的情况下,

date; hostname; uptime; cat /etc/resolv.conf

有关的:

答案2

按照man cat

将文件连接到标准输出。

没有 FILE 或 FILE 为 - 时,读取标准输入。

因此,如果您提供 FILE,则不会读取标准输入。

这不是 bash 功能,它也适用于(或不适用于)普通文件。

相关内容