Bash脚本执行多个命令

时间:2015-04-17 16:55:01

标签: linux bash shell

我是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

1 个答案:

答案 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