프로그램은 하나의 터미널에서만 실행될 수 있습니다

프로그램은 하나의 터미널에서만 실행될 수 있습니다

두 개의 다른 폴더와 두 개의 다른 터미널에서 이 명령을 실행합니다.

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=`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

관련 정보