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
当我在没有 nohup
和 bash -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 &
我正在尝试在后台执行一个脚本,分离的,有延迟的。
我有以下脚本:
#!/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
的情况下尝试时,输出符合预期,但调用脚本必须保持 运行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 &