我是bash的新手。我的问题是,当我运行这个脚本时,它只执行第一个命令而不完成其余的命令。有没有办法让bash从一个启动脚本执行所有这些命令?
我有一个启动脚本如下:
#! /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
答案 0 :(得分:7)
exec
命令告诉bash执行execve()
系统调用所做的相同操作 - 用正在运行的程序替换自己的进程表条目。
本质上,此操作意味着脚本在完成时不再运行。如果您不想要,只需取出exec
前缀。
(另外,完全没有理由在这里使用wait
; wait
只有在进程背景化的情况下才会产生任何影响,并且您不会背景任何事情)。
也就是说,您可以考虑使用子shell来限定cd
操作的范围 - 然后exec
将仅替换子shell的进程,而不是父进程;即使在这种情况下,它也不是绝对必要的,但是稍微进行性能优化(同样,将#!/bin/bash
替换为#!/bin/sh
是提供轻量级/bin/sh
的平台的性能改进,因为您没有使用任何仅限bash的功能):
#!/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