Скрипт Bash запускает строки программы одну за другой

#python #bash

Вопрос:

Это мой сценарий bash. Как запустить три командные строки одну за другой (таким образом, вторая команда ждет завершения первой, а третья команда ждет завершения второй).

 #!/bin/bash

python /path/to/someprogramm.py analyze --probes /path/to/myfile.bed --rpkm_dir /path/to/RPKM/ --output /path/to/hdf5/analysis.hdf5 --write_svals /path/to/SVD/singular_values.txt;

python /path/to/someprogramm.py call --input /path/to/hdf5/analysis.hdf5 --output /path/to/calls.txt;

python /path/to/someprogramm.py plot --input /path/to/hdf5/analysis.hdf5 --calls /path/to/calls.ng.txt --outputdir /path/to/call_images/;

echo "Command sequence finished succesfully"
 

Комментарии:

1. Вы имеете в виду, что хотите, чтобы они начинались параллельно, а не ждали завершения предыдущего, прежде чем начнется следующий?

2. Мне нужно запускать одну за другой, так как вторая команда принимает в качестве входных данных выход 1-й команды. Поэтому вторая команда должна подождать, пока не завершится первая. а третий должен подождать второго.

3. Затем просто запустите сценарий, вот что произойдет….

4. У вас есть окончание строки в стиле DOS (Windows). Исправьте это в системе GNU с помощью sed -i 's/r//' filename.sh

5. @user3224522 Более простое решение проблемы с окончаниями строк-использовать dos2unix . Еще проще: пусть ваш текстовый редактор сгенерирует правильные окончания строк при написании файла, так что вам больше не придется об этом думать.

Ответ №1:

Я думаю, что Баш пытается съесть некоторые из ваших вариантов Python. Чтобы исправить это, заключите каждую строку в кавычки и поставьте eval впереди:

 #!/bin/bash

eval 'python /path/to/someprogramm.py analyze --probes /path/to/myfile.bed --rpkm_dir /path/to/RPKM/ --output /path/to/hdf5/analysis.hdf5 --write_svals /path/to/SVD/singular_values.txt'
eval 'python /path/to/someprogramm.py call --input /path/to/hdf5/analysis.hdf5 --output /path/to/calls.txt'
eval 'python /path/to/someprogramm.py plot --input /path/to/hdf5/analysis.hdf5 --calls /path/to/calls.ng.txt --outputdir /path/to/call_images/'
echo 'Command sequence finished succesfully'
 

Ответ №2:

  1. Это происходит по умолчанию. Чтобы избежать этого, вы можете создать фон для каждого процесса, добавив amp; его к каждой строке, но вы этого не сделали.
  2. Вам не нужно ; в конце bash строки.
  3. Вы можете убедиться , что следующая строка следует за успешным запуском, добавив amp;amp; к каждой строке и объединив ее с помощью трейлинга или, как вариант, set -e в начале сценария.

Комментарии:

1. Я попытался amp;amp; , но безуспешно, та же ошибка.. строка 2: $’r’: команда не найдена

2. как я уже отмечал выше, это похоже на встроенные r символы. вы можете исправить это, sed как уже упоминалось.

Ответ №3:

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

Возможно, вы также захотите добавить

 set -e
 

к началу сценария (но после #!/bin/bash ), чтобы остановить весь сценарий в случае сбоя команды.

И вы также можете добавить if инструкцию , которая проверяет переменную $? , она будет иметь значение 0 , если предыдущая команда была успешно выполнена.

Один или несколько из этих трех вариантов должны просветить вас относительно того, что происходит.

Комментарии:

1. Честно говоря, я готовил это письмо точно в то же время, что и этот ответ. При всем уважении не согласен с тем, что использование $? -плохой совет.. просто предложение, которое будет зависеть от того, как в конечном итоге будет написан сценарий.

2. @Z4-уровень, часто случается, что кто-то другой самостоятельно придумывает то же самое решение и не видит другого ответа, пока не опубликует свой собственный. Я бывал на каждом его конце время от времени.

3. справедливо, я думаю, что ошибочно As mentioned already, сослался на другой ответ, но, перечитывая его сейчас, я, вероятно, ссылаюсь на комментарии к вопросу.

4. Да, просто ссылка на комментарии 🙂