Операторы BASH выполняются в одиночку, но возвращают «нет такого файла» в цикле for - PullRequest
1 голос
/ 25 марта 2010

Еще один вопрос, на который я не могу найти ответ, и мне кажется, что я сошел с ума.
У меня есть сценарий BASH, использующий цикл for для выполнения сложной команды (много выравниваний последовательности белка) для большого количества файлов (~ 5000). Цикл создает операторы, которые будут выполняться, если они даны по отдельности (то есть скопированы из сообщения об ошибке в командную строку), но которые возвращают «нет такого файла или каталога» внутри цикла. Сценарий ниже; на самом деле есть еще несколько аргументов, но это включает в себя некоторые представительные аргументы и аргументы файла. &#35;!/bin/bash</p> <p>&#35; Pass directory with targets as FASTA sequences as argument. &#35; Arguments to psiblast &#35; 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</p> <p>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

Запуск этих сценариев дает "<имя_ сценария> строка <последняя строка перед 'выполнено'>: <попытанная команда>: такого файла или каталога нет. Если я вставлю предпринятую команду в приглашение, оно будет запущено.
Каждая из этих команд выполняется за пару минут.

Ответы [ 3 ]

2 голосов
/ 25 марта 2010

попробуй без кавычек. и ты забыл несколько косых черт.

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 голосов
/ 29 марта 2010

Добавление кавычек к именам файлов не поможет при использовании цикла for. Чтобы преодолеть это, я всегда делал что-то похожее на следующий пример всякий раз, когда мне нужно было перебрать имена файлов:

ls -1 directory | { while read line; do echo $line; done; }
0 голосов
/ 25 марта 2010

Поведение, которое вы наблюдаете, будет иметь место, если в именах файлов, по которым вы выполняете перебор, есть пробелы. По этой причине вам нужно правильно указывать имена файлов, как в следующем минимальном примере:

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