Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash脚本执行多个命令_Linux_Bash_Shell - Fatal编程技术网

Linux 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

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

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