我是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
Run Code Online (Sandbox Code Playgroud)
该exec命令告诉bash执行execve()syscall 所做的相同操作- 用正在运行的程序替换它自己的进程表条目.
本质上,此操作意味着脚本在完成时不再运行.如果您不想这样,只需取出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
Run Code Online (Sandbox Code Playgroud)