Bash循环意外地表现

时间:2013-12-25 08:04:33

标签: bash shell

我正在研究一个简单的守护进程示例,并注意到以下命令在每次迭代时都会打印相同的时间值。

/bin/bash -c "while true; do echo `date`; sleep 1; done"

输出:

Wed Dec 25 08:00:47 UTC 2013
Wed Dec 25 08:00:47 UTC 2013
Wed Dec 25 08:00:47 UTC 2013

但是,如果我将上面的代码放在脚本中然后运行脚本,它会给出预期的输出。

#!/bin/bash
while true; do
   echo `date`
   sleep 1
done

输出:

Wed Dec 25 08:02:58 UTC 2013
Wed Dec 25 08:02:59 UTC 2013
Wed Dec 25 08:03:00 UTC 2013

这怎么可能?这是预期的产出吗?

1 个答案:

答案 0 :(得分:8)

它的行为完全符合预期。 date替换由调用者bash执行,而不是由被调用者执行。以这种方式改变命令:

/bin/bash -c 'while true; do echo `date`; sleep 1; done'

你得到了你期望的行为。

不同之处在于单引号和双引号字符串 - 后者受参数扩展命令替换

的影响