我正在尝试执行脚本,分离,延迟并在后台执行。
我有以下脚本:
#!/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
当我在没有nohup
和bash -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][]
答案 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 &