带睡眠的nohup bash调用被错误地评估

时间:2017-04-04 07:14:02

标签: bash nohup

我正在尝试执行脚本,分离,延迟并在后台执行。

我有以下脚本:

#!/bin/sh
echo "[$(date)][${HOST}] Immediate date" > ~/out.log
nohup bash -c "sleep 2 && echo '[$(date)][${HOST}] Delayed date'" >> ~/out.log 2>&1 &

我希望out.log包含两行,如下所示:

[Tue Apr  4 08:55:56 CEST 2017][] Immediate date
[Tue Apr  4 08:55:58 CEST 2017][] Delayed date

请注意时间戳相隔2秒。但相反,机器人日期读取完全相同...

[Tue Apr  4 08:55:56 CEST 2017][] Immediate date
[Tue Apr  4 08:55:56 CEST 2017][] Delayed date

当我在没有nohupbash -c的情况下尝试输出时,输出是预期的,但调用脚本必须继续运行,否则第二个命令将被中止。

是什么导致日期没有差异并修复它?

修改

我简化了stackoverflow的命令。但是现在当我再次展开它时,我遇到了另一个变量扩展问题。当我添加HOST变量时:

HOST=foo.bar
nohup bash -c 'sleep 2 && echo "[$(date)][${HOST}]" Delayed date' >> ~/out.log 2>&1 &

输出文件dos不包含foo.bar

[Tue Apr  4 12:52:11 CEST 2017][]

2 个答案:

答案 0 :(得分:2)

$(date)由外部shell脚本评估。如果您将"'交换,它会按预期的方式工作。这是因为双引号中的$(..)已解析,即使您将其放在双引号字符串中的单引号中。

#!/bin/sh
echo "[$(date)][${HOST}] Immediate date" > ~/out.log
nohup bash -c 'sleep 2 && echo "[$(date)]['"${HOST}"'] Delayed date"' >> ~/out.log 2>&1 &

编辑:使代码工作w.r.t. $HOST + $ HOST包含空格

答案 1 :(得分:0)

我相信nohup中的双引号会立即评估nohup命令中的表达式。 将双引号更改为单引号(并使用回显的双引号可能有帮助,例如

#!/bin/sh
echo "[$(date)][${HOST}] Immediate date" > ~/out.log
nohup bash -c 'sleep 2 && echo "[$(date)][${HOST}] Delayed date"' >> ~/out.log 2>&1 &