计算并记录管道中传递的参数数量

时间:2014-07-14 00:22:57

标签: bash unix pipe tee

有没有办法计算和记录通过管道的参数数量?我正在从一个未知长度的文件中管道一个值。我可以使用tee将数字转储到STDOUT,但无法将它们转换为变量:

seq 10 | tee >(wc -l) | xargs echo 

我对这种美学和我自己的理解是否可能感兴趣,而不是一些迂回的替代方案,例如重新扫描(非txt)file_of_unknown长度两次,或写入实际文件然后读回来等等

谢谢!

2 个答案:

答案 0 :(得分:0)

这是你在找什么?

sh$ seq 10 | tee >(wc -l > /tmp/f) | xargs echo; V=$(cat </tmp/f)
1 2 3 4 5 6 7 8 9 10
sh$ echo $V
10

如果您不喜欢使用临时文件(我应该使用mktemp ...),可以使用 fifo mkfifo )而不是?


如果可以使用 stderr 作为输出,您可以将示例重写为:

sh$ V=$(seq 10 | tee >(xargs echo 1>&2) | wc -l)
1 2 3 4 5 6 7 8 9 10
sh$ echo $V
10

答案 1 :(得分:0)

管道中的组件(例如OP中的tee)在子shell中执行。因此,它无法修改父shell的变量。这是关于子壳和壳变量的一般规则。每个shell都有自己的变量;当一个(子)shell启动时,(某些)父shell的变量被复制到子shell中,但是父变量和子变量之间没有链接。

您可以使用管道在子shell之间进行通信,但是在管道中您已经这样做了,因此很难协调另一层,尽管这并非不可能。但是,美学并不是很好。

所以基本上你最好的方法就是你明确放弃的方法,“写入实际文件然后回读”。这很简单可靠,并且速度非常快,特别是如果文件位于内存临时文件系统中(请参阅tmpfs)。

顺便说一句,xargs通常在空格处拆分输入行以生成参数,因此通常它接收的参数数量与它读取的行数不同。