#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:
- Это происходит по умолчанию. Чтобы избежать этого, вы можете создать фон для каждого процесса, добавив
amp;
его к каждой строке, но вы этого не сделали. - Вам не нужно
;
в концеbash
строки. - Вы можете убедиться , что следующая строка следует за успешным запуском, добавив
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. Да, просто ссылка на комментарии 🙂