Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 计算并记录管道中传递的参数数_Bash_Unix_Pipe_Tee - Fatal编程技术网

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

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

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

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