[转载]& 后台进程符的使用 [文摘]

& 后台运行命令. 一个命令后边跟一个& 表示在后台运行.让我们通过3个例子来初步了解这个命令。
 
Example 1:
 
bash$ sleep 10 &
[1] 850
[1]+  Done                    sleep 10
 
Example 2 (在后台运行一个循环):
 
  1 #!/bin/bash
  2 # background-loop.sh
  3
  4 for i in 1 2 3 4 5 6 7 8 9 10            # 第一个循环.
  5 do
   echo -n "$i "
  7 done & # 在后台运行这个循环.
        # 在第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
 16
 17 echo   # 这个'echo'某些时候将不会显示.
 18
 19 # ======================================================
 20
 21 # 期望的输出应该是:
 22 # 1 2 3 4 5 6 7 8 9 10
 23 # 11 12 13 14 15 16 17 18 19 20
 24
 25 # 然而实际的结果有可能是:
 26 # 11 12 13 14 15 16 17 18 19 20
 27 # 1 2 3 4 5 6 7 8 9 10 bozo $
 28 # (第2个'echo'没执行, 为什么?)
 29
 30 # 也可能是:
 31 # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 32 # (第1个'echo'没执行, 为什么?)
 33
 34 # 非常少见的执行结果, 也有可能是:
 35 # 11 12 13 1 2 3 4 5 6 7 8 9 10 14 15 16 17 18 19 20
 36 # 前台的循环先于后台的执行.
 37
 38 exit 0
 39
 40 #  Nasimuddin Ansari 建议加一句 sleep 1
 41 #+ 在6行和14行的 echo -n "$i" 之后加这句.
 42 #+ 为了真正的乐趣.
 
Example 3:
 
在一个脚本内后台运行一个命令,有可能造成这个脚本的挂起,等待一个按键(Enter)的响应. 看起来只有在这个命令的结果需要输出到stdout的时候, 这种现象才会出现. 这是个很烦人的现象.幸运的是, 我们有针对这个问题的解决办法.
 
1)
  1 #!/bin/bash
  2 # test.sh        
  3
  4 ls -l &
  5 echo "Done."
bash$ ./test.sh
Done.
 [bozo@localhost test-scripts]$ total 1
 -rwxr-xr-x    1 bozo     bozo           34 Oct 11 15:09 test.sh
 _
       
2)
  1 #!/bin/bash
  2 # test.sh        
  3
  4 ls -l &
  5 echo "Done."
  6 wait
bash$ ./test.sh
Done.
 [bozo@localhost test-scripts]$ total 1
 -rwxr-xr-x    1 bozo     bozo           34 Oct 11 15:09 test.sh
 
看起来只要在后台运行命令的后边加上一个wait命令就会解决这个问题.
如果将后台运行命令的输出重定向到文件中或/dev/null中, 也能解决这个问题.
 
[文摘摘自: 高级Bash脚本编程指南-3.9.1_cn]
原文地址:https://www.cnblogs.com/liuzhuqing/p/7481005.html