有没有办法计算和记录通过管道的参数数量?我正在从一个未知长度的文件中管道一个值。我可以使用tee将数字转储到STDOUT,但无法将它们转换为变量:
seq 10 | tee >(wc -l) | xargs echo
我对这种美学和我自己的理解是否可能感兴趣,而不是一些迂回的替代方案,例如重新扫描(非txt)file_of_unknown长度两次,或写入实际文件然后读回来等等
谢谢!
答案 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
通常在空格处拆分输入行以生成参数,因此通常它接收的参数数量与它读取的行数不同。