2010-03-25 3 views
1

또 다른 답변을 찾을 수 없지만 화가났습니다.
많은 파일 (~ 5000)에 복잡한 명령 (많은 단백질 순서 정렬)을 실행하는 for 루프를 사용하는 BASH 스크립트가 있습니다. 루프는 단독으로 제공 될 때 (즉, 오류 메시지에서 명령 프롬프트로 복사 붙여 넣기) 실행되지만 루프 내에 "그러한 파일 또는 디렉토리 없음"을 반환하는 명령문을 생성합니다. 아래 스크립트; 실제로는 몇 가지 더 많은 논쟁이 있지만 여기에는 몇 가지 대표적인 논점과 파일 인수가 포함됩니다. > '완료'하기 전에이 스크립트를 실행 BASH 문은 단독으로 실행되지만 for 루프에 "no such file"을 반환합니다.

 
#!/bin/bash

# Pass directory with targets as FASTA sequences as argument. # Arguments to psiblast # Common db=local/db/nr/nr outfile="/mnt/scratch/psi-blast" e=0.001 threads=8 itnum=5 pssm="/mnt/scratch/psi-blast/pssm." pssm_txt="/mnt/scratch/psi-blast/pssm." pseudo=0 pwa_inclusion=0.002

for i in ${1}/* do filename=$(basename $i) "local/ncbi-blast-2.2.23+/bin/psiblast\ -query ${i}\ -db $db\ -out ${outfile}/${filename}.out\ -evalue $e\ -num_threads $threads\ -num_iterations $itnum\ -out_pssm ${pssm}$filename\ -out_ascii_pssm ${pssm_txt}${filename}.txt\ -pseudocount $pseudo\ -inclusion_ethresh $pwa_inclusion" done

는 < scriptname는 > 라인에게 "< 마지막 줄을 제공합니다 : < 명령 > 시도 :. 해당 파일이나 디렉토리를 그때가 실행됩니다 프롬프트에 시도 된 명령을 붙여 넣을 경우 . 이 명령의
각. 몇 분 실행 따옴표없이

답변

2

시도합니다. 그리고 당신은 어떤 슬래시를 잊어 버렸습니다.

for i in ${1}/* 
do 
filename=$(basename $i) 
local/ncbi-blast-2.2.23+/bin/psiblast \ 
-query "${i}" \ 
-db "$db" \ 
-out "${outfile}/${filename}.out" \ 
-evalue "$e" \ 
-num_threads "$threads" \ 
-num_iterations "$itnum" \ 
-out_pssm "${pssm}/$filename" \ 
-out_ascii_pssm "${pssm_txt}/${filename}.txt" \ 
-pseudocount "$pseudo" \ 
-inclusion_ethresh "$pwa_inclusion" 
done 
+0

슬래시가 없기 때문에 변수에 절대 경로와 일반 파일 이름 접미사 . –

+0

전체 multiline 명령을 인용하지 않아서 고마워. –

0

반복되는 파일 이름에 공백이 있으면 관찰하는 동작이 발생합니다. 이러한 이유로, 제대로 다음과 같은 최소한의 예에서와 같이, 당신의 파일 이름을 인용 할 것이다 : 루프를 사용하는 경우 파일 이름에

#!/bin/bash 
for i in * 
do 
    filename="$(basename "$i")" 
    command="ls -lah '$filename'" 
    echo "filename=$filename" 
    echo "Command = $command" 
    eval "$command" 
done 
+0

내 파일 이름에는 공백이 없습니다. 어쨌든 따옴표를 추가하는 것은 도움이되지 않습니다. –

0

추가 따옴표가 도움이되지 않습니다. 이 문제를 극복하기 위해 필자는 파일 이름을 반복 할 때마다 항상 다음 예제와 비슷한 것을 수행했습니다.

ls -1 directory | { while read line; do echo $line; done; } 
관련 문제