管道只读取一行输入的程序的最佳方法

Fel*_*lva 2 linux bash

假设我有一个命令cmd1,它从标准输入读取一行输入并产生一行输出.我还有另一个命令cmd2,它产生多行输出.如何在linux中管理这两个命令,以便为cmd2生成的每一行执行cmd1?如果我只是这样做:

# cmd2 | cmd1
Run Code Online (Sandbox Code Playgroud)

cmd1将只接受cmd2的第一行输出,产生一行输出然后关闭.我知道我可以使用像perl这样的解释器来完成这项工作,但我想知道是否有一种干净的方法只使用bash脚本来完成它.

谢谢

Mat*_*Mat 7

你可以使用这样的while循环:

#! /bin/bash
IFS=$'\n'
while read -r line ; do
    echo "$line" | cmd1
done < <(cmd2)
Run Code Online (Sandbox Code Playgroud)

应该保留行中的空格.(-rin read是进入"原始"模式以防止反斜杠解释.)