Мой код застревает в этом, пока каталог с заявлением цикла не существует, почему это так? - PullRequest
0 голосов
/ 12 июня 2019

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

Directory path exists
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
...

так продолжается постоянно.

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

#!/bin/bash


#set value of i
i=`k=$(ls md*gro -v1 | tail -n1) ; echo ${k//.gro/} | sed "s/md//"`

# while more than 20 waters ...
while (grep -c SOL  md$i.gro > 20); do

    DIRECTORY=~/scratch/desolvation/iteration_$i
    GROPATH=~/scratch/desolvation/iteration_$i/md$i.gro
    ERRORPATH=~/scratch/desolvation/log_gpu.dat

#does the directory exist?
        if [ -d "$DIRECTORY" ]; then
                echo "Directory path exists"

# does gro file exist?
                while [ ! -d "$GROPATH" ]; do
                        echo "GROPATH does not exist"
                        if grep -q 'error' "$ERRORPATH"; then
                                echo "error in gromacs"; exit
                        else echo "waiting" sleep 10800
                        fi
                done

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

1 Ответ

2 голосов
/ 12 июня 2019

Тест [ ! -d "$GROPATH" ] проверяет каталог по этому имени, а не файл. Чтобы проверить файл, используйте -f вместо -d (или просто используйте -e, который проверит на что угодно с таким именем).

Другие проблемы: while (grep -c SOL md$i.gro > 20); do не делает то, что вы хотите; () создает подоболочку, которая запускает команду grep с выводом, перенаправленным в файл с именем "20". Вместо этого используйте while [ "$(grep -c SOL md$i.gro)" -gt 20 ]; do.

Кроме того, у вас есть echo "waiting" sleep 10800 в качестве одной команды, поэтому он печатает «сон 10800» вместо выполнения его в качестве команды; просто переместите его на отдельную строку.

И способ, которым вы выбираете i, - беспорядок; попробуйте это вместо:

i=$(printf '%s\n' md*.gro | sed 's/^md//; s/[.]gro$//' | sort -rg | head -n1)

Общее предложение: запустите ваши скрипты через shellcheck.net , чтобы определить общие проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...