从 shell 命令输出中捕获第一行并继续处理其余部分

问题描述 投票:0回答:1

我试图捕获并“存储”(最好在变量中)命令输出的第一行,并将输出的其余部分转发回管道中下一个命令的标准输入。仅供参考,目的是在处理返回的数据时捕获并存储

redis-cli SCAN
调用的游标引用。

这就是我想到的:

command | { read first_line ; cat ; } | process_rest

这似乎在 zsh 中按预期工作,但在 Bourne Shell(“/bin/sh”)或 bash 中则不然。看来,通过管道传输到命令分组会导致 sh/bash 中出现一个子 shell,“吞噬”first_line 变量。

实现我想要做的事情的最佳方法是什么?我是否需要通过文件或 fifo“管道”第一行,而不是尝试设置变量?我还尝试使用

while read line ; do
构造来过滤掉第一行并继续处理其余的行,但看起来它具有相同的效果(do/done 块内的任何变量更改都不会反映在外部范围中)。

bash shell sh
1个回答
0
投票

您可以考虑使用临时文件:

tempfile=$(mktemp)
command | { read -r first_line ; printf "%s\n" "$first_line" > "$tempfile"; cat ; } | process_rest
© www.soinside.com 2019 - 2024. All rights reserved.