두 개의 다른 폴더와 두 개의 다른 터미널에서 이 명령을 실행합니다.
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