2015-04-17 4 views
2

Я новичок в bash. Моя проблема заключается в том, что когда я запускаю этот скрипт, он выполняет только первую команду и не заканчивает остальные. Есть ли способ заставить bash выполнить все эти команды из одного сценария запуска?Bash Script выполняет несколько команд

У меня есть сценарий запуска:

#! /bin/bash 
cd dockerfiles/nginx 
exec docker build -t nginx . 
wait 
cd ../percona 
exec docker build -t percona . 
wait 
cd ../memcache 
exec docker build -t memcache . 
wait 
cd ../sphinx 
exec docker build -t sphinx . 
wait 
cd .. 
exec docker build -t php . 
wait 
cd .. 
exec docker-compose up 

ответ

7

Команда exec говорит Баш, чтобы сделать то же самое, проделанную execve() - для системного вызова заменить свою собственную запись в таблице процессов с программой запущенной ,

По своей природе эта операция означает, что сценарий больше не работает при завершении. Если вы этого не хотите, просто достаньте префиксы exec.

(Кроме того, нет абсолютно никаких оснований для использования здесь wait; wait имеет какой-либо эффект независимо от того, связан ли процесс с фоном, и вы ничего не используете).


Тем не менее, вы можете рассмотреть возможность использования подоболочки размаха в cd операций - а затем exec заменят только процесс подоболочки, а не родители; это не является строго необходимым, даже в этом случае, но это небольшая оптимизация производительности (то же самое, заменив #!/bin/bash с #!/bin/sh является повышение производительности на платформах, обеспечивающих легкий /bin/sh, так как вы не используете Баш-только функция):

#!/bin/sh 
(cd dockerfiles/nginx && exec docker build -t nginx .) 
(cd dockerfiles/percona && exec docker build -t percona .) 
(cd dockerfiles/memcache && exec docker build -t memcache .) 
(cd dockerfiles/sphinx && exec docker build -t sphinx .) 
(cd dockerfiles && exec docker build -t php .) 
docker-compose up 
+0

Вы можете увидеть внесенные изменения, которые позволят вам избавиться от беспорядка 'cd ..' (и фактически _do_ сделать выгодное использование' exec', хотя и в качестве полностью дополнительного повышения производительности). –

+0

Я вижу ваши изменения и изменил свой сценарий в соответствии с ними. Это намного лучше, чем у меня. Спасибо за помощь. – Johnathon22

+0

Также обратите внимание, что это можно упростить с помощью цикла: 'for f в nginx percona memcache sphinx; do (cd dockerfiles/$ f && exec docker build -t $ f.); done' Это облегчает для читателя, чтобы он мог видеть сходства в командах. –

Смежные вопросы