1 #!/bin/bash
2 #background-loop.sh
3
4 for i in 1 2 3 4 5 6 7 8 9 10 #第一个循环
5 do
6 echo -n "$i"
7 done& #在后台运行这个循环
8 #在第2个循环之后,将在某些时候执行.
9
10 echo #这个'echo'某些时候将不会显示.
11
12 for i in 11 12 13 14 15 16 17 18 19 20 #第二个循环
13 do
14 echo -n "$i"
15 done
大家看一下这个脚本,每次运行的结果都是不同的,想请教一下&在脚本里的作用。
正常的情况下&是后台运行程序。但在脚本里有点不一样啊。
shell脚本里使用&后台运行标志
- badboych22
- 帖子: 200
- 注册时间: 2007-09-11 15:15
-
- 帖子: 2841
- 注册时间: 2006-09-11 22:47
Re: shell脚本里使用&后台运行标志
你这个脚本执行结果很正常。
& 的含义并不是“后台执行”,而是 fork。
fork 之后,主进程运行 & 后面的内容,而子进程运行 & 前面的内容。
特别的,当 & 后面的内容为空时,主进程退出了,仅仅有子进程在运行,看起来实现了“后台运行”的效果。
但是就你这个脚本而言, & 的后面还有那么多代码呢。。。所以后面那段代码就是主进程,& 前面的所有代码就成了子进程
& 的含义并不是“后台执行”,而是 fork。
fork 之后,主进程运行 & 后面的内容,而子进程运行 & 前面的内容。
特别的,当 & 后面的内容为空时,主进程退出了,仅仅有子进程在运行,看起来实现了“后台运行”的效果。
但是就你这个脚本而言, & 的后面还有那么多代码呢。。。所以后面那段代码就是主进程,& 前面的所有代码就成了子进程
-
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
Re: shell脚本里使用&后台运行标志
脚本里也是在后台运行。
如果不是在脚本里,在输入后一条命令时,前面放到后台中执行的命令已经执行完了。
如果在脚本里,则有可能导致两条命令的输出互相交错,因为这两条命令是“同步”执行的结果。
如果不是在脚本里,在输入后一条命令时,前面放到后台中执行的命令已经执行完了。
如果在脚本里,则有可能导致两条命令的输出互相交错,因为这两条命令是“同步”执行的结果。
- ptptptptptpt
- 帖子: 3711
- 注册时间: 2006-09-19 18:16
Re: shell脚本里使用&后台运行标志
照此文的说法,& 只对前面的一条命令(a command)起效,而不是 “& 前面的所有代码” 。我的理解,整个 if ... fi 和 for ... done 代码块被当成一条命令。The Bash & (ampersand) is a builtin control operator used to fork processes. From the Bash man page, "If a command is terminated by the control operator &, the shell executes the command in the background in a subshell".
If logged into an interactive shell, the process is assigned a job number and the child PID is displayed. The job number below is one.
Note that when a process is forked, the child PID is stored in the special variable $!代码: 全选
bash$ sleep 30 & [1] 3586
You can terminate the job by its job number like so:代码: 全选
bash$ echo $! 3586
代码: 全选
bash$ jobs [1]+ Running sleep 30 & bash$ kill %1 [1]+ Terminated sleep 30 bash$
跟 C 里的 fork 还是很不同的。
- trigger
- 帖子: 1604
- 注册时间: 2006-10-25 18:08
Re: shell脚本里使用&后台运行标志
#!/bin/bash
#background-loop.sh
for i in {0..9}
do
echo -n "$i"
done&
echo
for i in {A..Z}
do
echo -n "$i"
done
这办法生成字串不错
#background-loop.sh
for i in {0..9}
do
echo -n "$i"
done&
echo
for i in {A..Z}
do
echo -n "$i"
done
这办法生成字串不错
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。