我正在研究一个简单的守护进程示例,并注意到以下命令在每次迭代时都会打印相同的时间值。
/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
这怎么可能?这是预期的产出吗?
答案 0 :(得分:8)
它的行为完全符合预期。 date
替换由调用者bash执行,而不是由被调用者执行。以这种方式改变命令:
/bin/bash -c 'while true; do echo `date`; sleep 1; done'
你得到了你期望的行为。
不同之处在于单引号和双引号字符串 - 后者受参数扩展和命令替换
的影响