使用tee将stdout加载到一行中的变量中

时间:2016-05-24 11:47:18

标签: bash

我试图将一行gzip文件中的行放入变量中,稍后我计划将此stdout用于使用tee的另一个进程。为什么不知道wc -l的值是否会被放入变量中,我该如何解决这个问题呢?

[]$ gzip -dc BC102.fastq.gz | wc -l
4255588
[]$ gzip -dc BC102.fastq.gz | echo $(wc -l)
4255588
[]$ gzip -dc BC102.fastq.gz | reads=$(wc -l); echo $reads
0

整条线最终应该看起来像

gzip -dc BC102.fastq.gz | tee >(reads=$(wc -l)) | cutadapt -ga...

我不知道这是How to set a variable to the output from a command in Bash?的副本,因为我已经应用了那里列出的答案来直接回应wc -l的值,但它不会被插入变量。

2 个答案:

答案 0 :(得分:3)

tee将stdout加上写入作为参数给出的所有文件。它不会写入您可以附加的两个不同的管道。

试试这个:

t=$(tempfile)
reads=$(gzip -dc BC102.fastq.gz | tee $t | wc -l)

现在您可以继续使用脚本

cutadapt -ga $t

reads包含行数。

答案 1 :(得分:0)

如果在子shell中设置变量,它将对父级没有影响。这就是

发生的事情
gzip -dc BC102.fastq.gz | tee >(reads=$(wc -l)) | cutadapt -ga...

但是没有明显的阻止你继续子shell中的管道:

reads=$(wc -l <(gzip -dc BC102.fastq.gz | tee >(cutadapt -ga... )))