Рекурсивный Grep действительно лучше ?;Как улучшить сценарий Bash на основе PBS ?;и другие вопросы - PullRequest
1 голос
/ 25 августа 2010

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

dump=`qstat -f `qstat``
if grep -q \
          "/${compounds[$i]}/D0_${j}_z_$((k*30))/scripts/jobscript_minim" \
      <<<$dump; then
      echo "Minimize is running!"
fi

Предложения по улучшению?

Также мне сказали, что $ () чище, чем ``. Но когда я пытаюсь:

dump="$(qstat -f "$(qstat)")"

... моя программа не работает. Почему это? Я неправильно понимаю, как вкладывать вызовы оболочки с помощью $ () ?? Или это как-то связано с тем, как я передаю список заданий очереди из qstat в qstat -f? Должен ли я использовать awk или что-то еще, чтобы получить задания из команды qstat, а затем как-то передать их как аргументы qstat -f?

Также я должен использовать рекурсивный grep? Некоторые люди говорят мне, что это «разумнее», но я не уверен, что это значит. Это более портативный? Это быстрее? Нужно ли меньше посещений терапевта?

Какова причина, по которой вы должны его использовать?

Ответы [ 4 ]

1 голос
/ 25 августа 2010

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

Кстати, вы должны действительно разделить свои вопросы на конкретные вопросы, а не публиковать их вместе - даже если у них есть что-то общее.Этот сайт работает лучше, когда вы делаете это таким образом.

1 голос
/ 25 августа 2010

Хорошо ... удалось найти чистое решение ...

search_dir="${compounds[${i}]}/D0_${j}_z_$[30*k]"
if [ ! -z "$(qstat -f $(qstat | grep -F jmick | awk '{print $1}')|\
      grep -F "$search_dir"|head -n 1)" ]
      then

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

Вопрос о том, в чем смысл рекурсивного grep, все еще стоит.

0 голосов
/ 25 августа 2010

dump=`qstat -f `qstat`` эквивалентно dump=$(qstat -f )qstat$(), что эквивалентно dump="$(qstat -f)qstat".

qstat -f "$(qstat)", вызывает qstat с двумя аргументами: опция -f и вывод qstatобъединились как одно слово.dump="$(qstat -f "$(qstat)")" устанавливает dump для вывода внешней команды qstat.

qstat -f $(qstat) вызывает qstat с любым числом аргументов, начиная с 1, в зависимости от вывода из qstat: сначалавыходные данные qstat разбиваются на отдельные слова в каждой последовательности пробелов, затем каждое слово, которое выглядит как шаблон глобуса (то есть содержит *, ? или [), который соответствует хотя бы одному файлу, заменяется насписок совпадающих имен файлов.Все эти слова и имена файлов становятся отдельными аргументами для внешнего qstat.

0 голосов
/ 25 августа 2010

Попробуйте без кавычек:

dump=$(qstat -f $(qstat))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...