Shell one-liner 用于在管道中间添加一条线

Ere*_*evi 6 shell pipe

我编写了一个脚本,将输入文件发送到 CPP,然后发送到 grep,然后发送到某个程序:

cpp $1 | grep -v "#" | theprogram
Run Code Online (Sandbox Code Playgroud)

但是,“theprogram”要求输入以某个常量行“theprogram-1.0”开头。所以,我想将该常量行添加到 grep 的输出之前,就在它被发送到“theprogram”之前。

当然,我可以使用临时文件来完成所有这些……但我确信有一种方法可以在一行 shell 管道中完成如此简单的任务,而无需临时文件。诀窍是什么?

Mar*_*ick 7

您可以用括号将一系列命令括起来。括号内的每个命令都可以访问相同的 stdin、stdout 和 stderr。在这里,echo将发送到标准输出但不会改变grep看到的标准输入。

cpp $1 | (echo 'your constant line here'; grep -v "#") | theprogram
Run Code Online (Sandbox Code Playgroud)

Shell command language: grouping commands 中所述,可以使用大括号代替括号进行分组。使用大括号稍微更有效,因为不会创建子shell,但它会呈现更复杂的语法:在 之后需要一个字段分隔,在 之前需要{一个分隔符,例如;或 换行符}。但是有几个人建议将其作为替代方案,所以这里是:

cpp $1 | { echo 'your constant line here'; grep -v "#"; } | theprogram
Run Code Online (Sandbox Code Playgroud)