Я хочу выполнить следующую команду:

$SCHRODINGER/utilities/prepwizard [options] inputfile outputfile

$ SCHRODINGER - это экспорт программного обеспечения, и в [options] я должен контролировать некоторые переменные вычисления внутри программы, которые не являются проблемой:

например:

$ SCHRODINGER/utilities/prepwizard -watdist 0 fillsidechains -fillloops inputfile outputfile

Я хочу запустить его для нескольких файлов с расширением .pdb, но проблема в том, что я должен запускать его один за другим, а не все одновременно. То есть, как только выполняется одно из следующих действий, вывод также может быть в .pdb

Я написал этот код, но он выполняет все файлы для меня в то время, и это не то, что я хочу:

for i in `ls *pdb`
do
$ SCHRODINGER / utilities / prepwizard [options] $i prep_$i 
done

2 ответа2

1

Во-первых, никогда не анализируйте вывод ls . Могут случиться плохие вещи. Символы типа \r и \n могут быть в именах файлов. Чтобы бороться с этим, bash globbing к вашим услугам:

for file in *.pdb
do
    ${SCHRODINGER}/utilities/prepwizard [options] "$file" "prep_${file}"
done

Или если вы хотите однострочник:

for file in *.pdb; do ${SCHRODINGER}/utilities/prepwizard [options] "$file" "prep_${file}"; done

Это выполнит каждый файл IN TURN и будет ждать, пока приложение prepwizard завершит работу, прежде чем перейти к следующему файлу.

-1

Чтобы выполнить несколько команд последовательно (одна выполняется после завершения предыдущей), вы можете разделить их точкой с запятой.

Таким образом, вы можете подготовить все свои команды в строке и проверить их после цикла:

allcommands=""
for i in `ls *pdb`
do
allcommands="$allcommands;SCHRODINGER options"
done
eval $allcommands

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .