Bash 中的进程替换

Raj*_*Raj 4 bash shell-script process-substitution

有人可以向我解释为什么我看不到以下命令中“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]#
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 5

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

命令

cat < <(date) <(hostname) <(uptime) <(cat /etc/resolv.conf)
Run Code Online (Sandbox Code Playgroud)

是相同的

cat <(hostname) <(uptime) <(cat /etc/resolv.conf) < <(date)
Run Code Online (Sandbox Code Playgroud)

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

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

cat - <(hostname) <(uptime) <(cat /etc/resolv.conf) < <(date)
Run Code Online (Sandbox Code Playgroud)

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

cat - <(hostname) <(uptime) /etc/resolv.conf < <(date)
Run Code Online (Sandbox Code Playgroud)

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

cat <(date) <(hostname) <(uptime) /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)

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

cat <( date; hostname; uptime; cat /etc/resolv.conf )
Run Code Online (Sandbox Code Playgroud)

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

date; hostname; uptime; cat /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)

有关的: