我试图捕获并“存储”(最好在变量中)命令输出的第一行,并将输出的其余部分转发回管道中下一个命令的标准输入。仅供参考,目的是在处理返回的数据时捕获并存储
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 块内的任何变量更改都不会反映在外部范围中)。
您可以考虑使用临时文件:
tempfile=$(mktemp)
command | { read -r first_line ; printf "%s\n" "$first_line" > "$tempfile"; cat ; } | process_rest