将 stdout 通过管道传输到另一个进程的文件描述符

Rog*_*tha 3 bash

到目前为止,这个一直在挫败我。我知道如何将我的标准输出重定向到同一进程中的另一个文件描述符。我知道如何将标准输出传输到另一个进程的标准输入。但是如果我想将一个进程的标准输出通过管道传输到另一个进程中的文件描述符怎么办?具体来说,对于 while read 的情况...

  cat file | while read -u 9 line; do //some stuff; done
Run Code Online (Sandbox Code Playgroud)

如何将 cat 的输出放到 while 循环的文件描述符 9 上?

che*_*ner 6

管道专门用于标准输入和输出(文件描述符 0 和 1);它们不会推广到其他描述符。请改用进程替换和输入重定向。

while read -u 9 line; do
  ...
done 9< <(cat file)
Run Code Online (Sandbox Code Playgroud)

当然,你不应该cat这样使用;只需使用常规输入重定向

while read -u 9 line; do
  ...
done 9< file
Run Code Online (Sandbox Code Playgroud)

额外的、符合 POSIX 标准的答案:使用命名管道。

mkfifo p
cat file > p &
while read line <&9; do
  ...
done 9< p
Run Code Online (Sandbox Code Playgroud)