程序只能在一个终端上运行

程序只能在一个终端上运行

我在两个不同的文件夹和两个不同的终端中执行此命令:

for i in *_RG.bam; do k=`echo $i | sed  "s/.bam/_Reordered.bam/"` java -jar /home/Programas/picard-tools-1.107/ReorderSam.jar R=/local/Referencias/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/genome.fa  I= $i O= "$k" ; done

在一个终端上它工作正常,但在另一个终端上代码根本不工作。它给出了下一个错误。

Runtime.totalMemory()=1517289472
To get help, see http://picard.sourceforge.net/index.shtml#GettingHelp
Exception in thread "main" net.sf.samtools.util.RuntimeIOException: File not found: 
    at net.sf.samtools.util.BinaryCodec.<init>(BinaryCodec.java:102)
    at net.sf.samtools.util.BlockCompressedOutputStream.<init>(BlockCompressedOutputStream.java:127)
    at net.sf.samtools.BAMFileWriter.<init>(BAMFileWriter.java:50)
    at net.sf.samtools.SAMFileWriterFactory.makeBAMWriter(SAMFileWriterFactory.java:154)
    at net.sf.samtools.SAMFileWriterFactory.makeBAMWriter(SAMFileWriterFactory.java:136)
    at net.sf.samtools.SAMFileWriterFactory.makeSAMOrBAMWriter(SAMFileWriterFactory.java:246)
    at net.sf.picard.sam.ReorderSam.doWork(ReorderSam.java:118)
    at net.sf.picard.cmdline.CommandLineProgram.instanceMain(CommandLineProgram.java:179)
    at net.sf.picard.cmdline.CommandLineProgram.instanceMainWithExit(CommandLineProgram.java:120)
    at net.sf.picard.sam.ReorderSam.main(ReorderSam.java:77)
Caused by: java.io.FileNotFoundException:  (No such file or directory)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
    at net.sf.samtools.util.BinaryCodec.<init>(BinaryCodec.java:95)
    ... 9 more

当我在新终端中调用该程序时java -jar /home/ktroule/Programas/picard-tools-1.107/ReorderSam.jar -h,它会按照我的预期打印帮助。

此后,我停止使用ctrl+c正常工作的终端,并交换终端以证明问题是否与文件或终端有关。同样的情况也发生了,只有一个终端可以工作(与之前的终端相同)。我关闭了无法工作的终端并打开了一个新终端,但代码仅在原始终端上有效。

我还比较了有效的终端和不通过 usinf 输出 printenv 的终端diff,两者都是相同的(除了该WINDOWID行)。

对这个问题有什么猜测吗?

我不会根据需要关闭运行代码的终端,而且我担心无法运行代码。

答案1

分配给后缺少分号k,k=...

在您的第一个终端中,您可能事先做了一些测试,例如:

k=`echo blah_RG.bam | sed  "s/.bam/_Reordered.bam/"`
echo $k

现在k已在您的 shell 中设置。

然后,当您将其扩展以包含 Java 处理时,输出文件将是$k.

然后你打开一个新的终端。这里$k没有设置。然后您尝试运行相同的命令,但是,由于$k未设置,Java 程序会抱怨找不到文件。O= "$k"将会O= ""

这也与提到各种的错误消息相匹配...WriterFileOutput...相对于...ReaderFileInput...。它根本无法打开没有/空名称的文件。

至于比较printenvenv注意该命令不包含 shell 变量。看看例如(set -o posix; set)


简单示例:

$ touch 1.foo 2.foo 3.foo
$ for i in *.foo; do k="$(echo $i | sed 's/.foo/.bar/')"; done

# Now k is set to last *.foo

$ for i in *.foo; do k="$(echo $i | sed 's/.foo/.bar/')" printf "i=%s k=%s\n" "$i" "$k"; done
i=1.foo k=3.bar
i=2.foo k=3.bar
i=3.foo k=3.bar

;然后在分配给之后尝试$k

$ for i in *.foo; do k="$(echo $i | sed 's/.foo/.bar/')"; printf "i=%s k=%s\n" "$i" "$k"; done
i=1.foo k=1.bar
i=2.foo k=2.bar
i=3.foo k=3.bar

您可以将其更改为类似以下内容:

for fn in *_RG.bam
do
    printf "Processing: %s\n" "$fn"

    java -jar /home/Programas/picard-tools-1.107/ReorderSam.jar \
    R=/local/Referencias/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/genome.fa \
    I="$fn" O="${fn%.bam}_Reordered.bam"
done

笔记:这里是多行并使用 bash 替换:

  ${fn%.bam}_Reordered.bam
    | |  |    |
    | |  |    +--------- Append _Reordered.bam
    | |  +-------------- Remove .bam
    | +----------------- Remove substring from end
    +------------------- Variable name

相关内容