我有一个bash脚本文件 date.sh :
#!/bin/bash
while true
do
sleep 1
echo "date------ "$(date)
done
我跑吧
$ ./date.sh >> date.log 2>&1 &
我可以在那里看到date.log并进行更新,但在我删除后,它不会被自动创建,即使我手动重新创建它,文件也不会更新,我想要日期.log将被自动创建并在删除后进行更新。
答案 0 :(得分:1)
在此代码中,date.log只打开 一次:
./date.sh >> date.log 2>&1 &
如果您希望date.log在缺少时重新创建,则每次写入时都需要重新打开:
#!/bin/sh
while true; do
sleep 1
echo "date------ $(date)" >>date.log
done
由于重定向>>date.log
在循环中,因此每个循环都会打开(并关闭)文件。这就是重新创建文件所需要的。
然后你可以运行它:
./date.sh &
现在,如果删除或重命名date.log,将创建一个名为date.log的新文件并将其写入。
请注意,使用每个循环重新打开和重新关闭文件效率较低。除非您想要重新创建本身功能,否则只需打开和关闭一次就会更快。
示例强>
这表明我们可以在脚本在后台运行时删除date.log,文件将很快被重新创建并附加到:
$ ./date.sh &
[1] 15678
$ cat date.log
date------ Sat Jul 30 00:51:28 PDT 2016
date------ Sat Jul 30 00:51:29 PDT 2016
date------ Sat Jul 30 00:51:30 PDT 2016
date------ Sat Jul 30 00:51:31 PDT 2016
$ rm -f date.log
$ cat date.log
date------ Sat Jul 30 00:51:38 PDT 2016
date------ Sat Jul 30 00:51:39 PDT 2016
date------ Sat Jul 30 00:51:40 PDT 2016
date------ Sat Jul 30 00:51:41 PDT 2016
date.sh
无法修改假设date.sh
归其他人所有,我们无法对其进行修改。在那种情况下:
./date.sh | awk -v f=date.log '{print>>f; close(f)}' &
awk循环遍历每一行输入,对于每一行,它打开date.log,追加到它并关闭它。
或者,如果由于某种原因我们想坚持使用纯壳:
./date.sh | while IFS= read -r line; do printf "%s\n" "$line" >>date.log; done &