Linux Bash脚本执行多个命令
我对bash还不熟悉。我的问题是,当我运行这个脚本时,它只执行第一个命令,而没有完成其余的命令。有没有办法让bash从一个启动脚本执行所有这些命令 我有一个如下的启动脚本:Linux Bash脚本执行多个命令,linux,bash,shell,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
#! /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
exec
命令告诉bash执行与execve()
syscall相同的操作——用正在运行的程序替换自己的进程表条目
本质上,此操作意味着脚本在完成时不再运行。如果您不想这样做,只需去掉exec
前缀即可
(此外,这里完全没有理由使用wait
;只有在流程是背景的情况下,wait
才有任何效果,而您没有背景)
这样说,您可以考虑使用子shell来覆盖<代码> CD>代码>操作——然后<代码> Exc> <代码>将只替换子shell的进程,而不是父进程;即使在这种情况下,它也不是绝对必要的,但只是一种轻微的性能优化(同样,将
#!/bin/bash
替换为#!/bin/sh
对于提供轻量级/bin/sh
的平台来说是一种性能改进,因为您没有使用任何仅限于bash的功能):
您可能会看到我添加的编辑,这让您摆脱了所有的
cd..
混乱(实际上,使用exec
,虽然这是一种完全可选的性能增强),我确实看到了您的编辑,并更改了脚本以匹配它们。这比我所拥有的要好得多。感谢您的帮助。还要注意,这可以通过一个循环来简化:用于nginx percona memcache sphinx中的f;do(cd dockerfiles/$f&&exec docker build-t$f.);完成
这使人类读者更容易看到命令中的相似之处。@williampersell;如果我们没有php
打破这种模式,我会建议这样做。(尽管我倾向于建议在代码中对扩展使用引号,只是为了演示良好的实践)
#!/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