在子shell中执行命令时,不会对当前的shell有任何影响,所有在子shell中执行的命令仅限于子shell内,例如:
cat test.sh
#!/bin/bash
cd /data
pwd
(
cd /usr/local/
ls -l
pwd
)
pwd
执行后的结果可能跟我们固有的想法大不一致
可以看到我们加上()后,就仿佛括号里的所有操作都与整个shell本身都没关系了,其实是开了一个子shell,所有的操作都是在子进程中执行。
#!/bin/bash
test1() {
num=1
while :
do
if [ $num -lt 5000000 ];then
let num+=1
else
echo over.
return
fi
done
}
test2() {
num=1
while true
do
if [ $num -lt 5000000 ];then
let num+=1
else
echo over.
return
fi
done
}
使用while : 时
使用while true 时
可以看到test1 函数执行速度是快于test2的,这是因为true是作为/bin中的一个二进制文件夹来实现的,在while循环中,每执行一次,shell就会生成一个进程,而 : 则是shell内建的命令,它总是返回一个0的退出码
再看实用点的命令
cat test.sh
#!/bin/bash
repeat() { while :;do $@ && return; sleep 3;done }
$1 $@
执行结果如下
大概每隔几秒就会去访问一次,直到下载成功。