shell脚本中等待上一条命令执行结束在执行下一条
参考地址:
https://blog.csdn.net/tiwoo/article/details/51094913
在开发中,我们有时候需要使用 Shell 脚本完成一些简单的操作,但是往往有的操作比较耗时,但是我们又不得不等待它执行完成后才能进行下面的步骤,所以许多朋友往往使用sleep等方法来强制等待操作完成,其实完全没有必要,我们只需要使用一个小小的 tricky 方法就可以实现精准等待操作完成的效果。
Shell 默认提供了获取命令执行输出的方法,即用 ` 号将需要获取输出的操作括起来,并赋值给一个变量,则 Shell 会在等待命令执行完成后把输出内容用于赋值,所以,这就是实现了我们需要的等待效果,并且时间精准性很高。
假设command 1执行需要1s,command 2执行需要视当前资源占用率花费10s~30s不等,command 3执行需要1s,则实现的代码如下:
#!/bin/sh
command 1
output=`command 2`
command 3
参考地址:https://blog.csdn.net/attack_city_lion/article/details/102616729?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-102616729-blog-51094913.pc_relevant_multi_platform_featuressortv2dupreplace&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-102616729-blog-51094913.pc_relevant_multi_platform_featuressortv2dupreplace&utm_relevant_index=1
首先了解下背景知识。
命令生效顺序
Linux系统下命令生效的顺序有以下4条:
绝对路径或相对执行的命令;
别名;
Bash的内部命令;
按照$PATH环境变量定义的目录查找顺序搜到的第一个命令。
实际shell脚本编写过程中,总会有这么一个场景,
#!/bin/bash
file=command1
command2 $file
下一条命令command2执行所需要的参数或者需要涉及的文件,是由上一条命令command1执行的结果产生的。
而command执行需要的时间可能要1分钟,但是个人实践之后认为shell脚本中的命令都是顺序执行的
这时候就需要我们等待着command1执行完在执行command2。
1 &&
shell1 && shell2 && shell3
2 若有for循环 在循环体之后使用wait sleep
#!/bin/bash
source ~/.bashrc
fun(){
echo "fun is begin.timeNum:$timeNum"
local timeNum=$1
sleep $timeNum &
wait #这个只等待wait前面sleep
echo "fun is end.timeNum:$timeNum"
}
3
#!/bin/sh
command 1
output=`command 2`
command 3
4
#!/bin/bash
for ((i=0;i<5;i++))
do
sleep 3;echo a
done
#运行需要15秒。
#!/bin/bash
for ((i=0;i<5;i++))
do
{
sleep 3;echo a
} &
done
wait
#打开5个子进程并行,运行只需要3秒。
linux简单实现先并行执行命令执行执行完毕后在执行后面的命令
参考地址:https://blog.csdn.net/themanofcoding/article/details/81663215
例如:有三个脚本:a.sh b.sh c.sh
需求:并行执行完这三个脚本之后,输出helloworld。
并行执行命令,通过&后台运行来实现,之后是等待并行执行完毕,输出helloworld。
sh a.sh &
sh b.sh &
sh c.sh &
wait
echo "helloworld"