nohup bash 睡眠调用评估不正确

nohup bash call with sleep is evaluated incorrectly

我正在尝试在后台执行一个脚本,分离的,有延迟的。

我有以下脚本:

#!/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 的情况下尝试时,输出符合预期,但调用脚本必须保持 运行ning,否则第二个命令将被中止.

是什么原因导致日期不同并修复它?

编辑:

我已经简化了 Whosebug 的命令。但是现在当我再次扩展它时,我 运行 变成了另一个变量扩展问题。当我添加 HOST 变量时:

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

输出文件不包含foo.bar:

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

$(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 包含空格

我相信 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 &