Bash 计算并记录管道中传递的参数数
有没有办法计算和记录通过管道的参数数量?我正在从一个长度未知的文件中导出一个值。我可以使用tee将数字转储到STDOUT,但无法将其放入变量:Bash 计算并记录管道中传递的参数数,bash,unix,pipe,tee,Bash,Unix,Pipe,Tee,有没有办法计算和记录通过管道的参数数量?我正在从一个长度未知的文件中导出一个值。我可以使用tee将数字转储到STDOUT,但无法将其放入变量: seq 10 | tee >(wc -l) | xargs echo 我感兴趣的是,对于美学和我自己的理解来说,这是否可能,而不是一些迂回的替代方案,例如重新扫描未知长度的(非txt)文件两次,或者写入实际文件,然后重新读入,等等 谢谢 这就是你要找的吗 sh$ seq 10 | tee >(wc -l > /tmp/f) | xa
seq 10 | tee >(wc -l) | xargs echo
我感兴趣的是,对于美学和我自己的理解来说,这是否可能,而不是一些迂回的替代方案,例如重新扫描未知长度的(非txt)文件两次,或者写入实际文件,然后重新读入,等等
谢谢 这就是你要找的吗
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
管道中的组件(如OP中的tee
)在子shell中执行。因此,它不能修改父shell的变量。这是关于子shell和shell变量的一般规则。每个外壳都有自己的变量;启动(子)shell时,(部分)父shell的变量将复制到子shell中,但父shell中的变量与子shell中的变量之间没有链接
您可以使用管道在子shell之间进行通信,但在管道中,您已经在这样做了,因此很难协调另一层,尽管这并非不可能。然而,美学并不伟大
因此,基本上,您最好的方法就是明确放弃的方法,“写入实际文件,然后读回”。这既简单又可靠,而且速度相当快,特别是当文件位于内存中的临时文件系统上时(请参见tmpfs
)
顺便说一下,xargs
通常在空白处拆分输入行以生成参数,因此通常它接收的参数数与读取的行数不同
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