プログラムは1つの端末でのみ実行できます

プログラムは1つの端末でのみ実行できます

2つの異なるフォルダと2つの異なる端末でこのコマンドを実行します。

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して、問題がファイルまたは端末に関連していることを確認しました。同じことが起こりました。ただ1つの端末だけが動作しました(以前と同じ)。動作していない端末を閉じて新しい端末を開いたが、元の端末でのみコードが動作します。

また、動作している端末をusinfを介してprintenvを出力しない端末と比較しましたが、diffどちらも同じです(該当行を除くWINDOWID)。

この問題について推測していますか?

必要に応じてコードを実行している端末を閉じずに、コードを実行できないかどうか心配です。

ベストアンサー1

割り当て後、セミコロンがありません。Kk=...

最初の端末では、おそらく次のようないくつかのテストを事前に実行したでしょう。

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

これでkシェルに設定されました。

その後、それを拡張してJava処理を含めると、出力ファイルは$k.

次に、新しい端末を開きます。ここに設定はありません$k。その後、同じコマンドを実行しようとしましたが、$k設定されていないため、Javaプログラムでファイルが見つからないと文句を言います。O= "$k"〜するO= ""

これは、さまざまな内容に言及するエラーメッセージとも一致します。...WriterそしてFileOutput...相対的な...ReaderそしてFileInput...。名前のないファイルまたは空のファイルは開けません。

比較のために、printenvまたはenvコマンドにシェル変数が含まれていないことに注意してください。例を見てください。(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

おすすめ記事