将stdout传递到另一个进程的文件描述符

时间:2018-09-28 14:12:39

标签: bash

到目前为止,这已经挫败了我。我知道如何在同一过程中将我的标准输出重定向到另一个文件描述符。我知道如何将stdout传递到另一个进程的stdin。但是,如果我想将一个进程的stdout传递给另一个进程中的文件描述符,该怎么办?具体来说,对于while读取的情况...

  cat file | while read -u 9 line; do //some stuff; done

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

3 个答案:

答案 0 :(得分:3)

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

while read -u 9 line; do
  ...
done 9< <(cat file)

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

while read -u 9 line; do
  ...
done 9< file

奖金,符合POSIX的答案:使用命名管道。

mkfifo p
cat file > p &
while read line <&9; do
  ...
done 9< p

答案 1 :(得分:1)

跳过useless use of cat并直接打开fd 9:

while read -u 9 line; do //some stuff; done 9< file

如果您确实想使用cat或其他任意命令,则根本不会使用管道。管道将stdout钩到stdin,但fd 9都不是。相反,您想先打开文件描述符,然后直接运行从文件描述符读取的命令。

exec 9< <(cat file)
while read -u 9 line; do //some stuff; done

如果您想一次完成所有操作,也可以将其与第一个答案结合起来。

while read -u 9 line; do //some stuff; done 9< <(cat file)

答案 2 :(得分:0)

不确定为什么要在这样的管道中从文件描述符9中读取内容,但是可以尝试以下操作:

cat test.in 9>&1 | while read -u 9 line; do
    echo ${line}
done 9<&0

希望这会有所帮助