如何在Linux命令行中将更多输入指定为单个输入?

时间:2017-11-10 10:49:29

标签: linux bash ubuntu command-line command-line-arguments

我在网上搜索但我找不到任何可以回答我问题的内容。

我在Ubuntu Linux中使用java工具,用bash命令调用它;此工具有两个不同输入文件的路径:

java -Xmx8G -jar picard.jar FastqToSam \
FASTQ=6484_snippet_1.fastq \ #first read file of pair
FASTQ2=6484_snippet_2.fastq \ #second read file of pair
[...]

我想做的是,例如,不要指定单个FASTQ的路径,而是指定两个不同文件的路径。

因此,我不希望cat file1 file2 > File使用File作为FASTQ的输入,而是希望此操作可以即时执行并创建File苍蝇,而不是保存在文件系统上(这将是命令cat file1 file2 > File)。

我希望我已经清楚地解释了我的问题,如果只是问我,我会尝试更好地解释。

1 个答案:

答案 0 :(得分:4)

接受文件名参数的大多数编写良好的shell命令通常也接受文件名参数列表。例如cat filecat file1 file2

如果您尝试使用的程序不支持此功能,并且无法轻松修复,则可能是您的操作系统或shell使/dev/stdin可用作伪文件。

cat file1 file2 | java -mumble -crash -burn FASTQ=/dev/stdin

有些shell也有进程替换,它们(通常)将调用程序视为包含进程替换在标准输出上产生的任何内容的单个文件。

java -mumble -crash -burn FASTQ=<(cat file1 file2) FASTQ2=<(cat file3 file4)

如果这些都不起作用,那么使用临时文件并在完成后删除它们的简单shell脚本是一个经过验证的真正解决方案。

#!/bin/sh
: ${4?Need four file name arguments, will process them pairwise}
t=$(mktemp -d -t fastqtwoness.XXXXXXX) || exit
trap 'rm -rf $t' EXIT HUP INT TERM  # remove in case of failure or when done
cat "$1" "$2" >$t/1.fastq
cat "$3" "$4" >$t/2.fastq
exec java -mumble -crash -burn FASTQ=$t/1.fastq FASTQ2=$t/2.fastq