我有一个bash脚本文件date.sh
#!/bin/bash
while true
do
sleep 1
echo "date------ "$(date)
done
我运行它
$ ./date.sh >> date.log 2>&1 &
我可以在那里看到一个date.log并进行更新,但是在我删除它之后,它不会被自动创建,即使我手动重新创建它,这个文件也不会更新,我想要自动创建date.log并在它被删除之后更新它。
发布于 2016-07-30 07:49:03
在此代码中,只打开一次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,追加并关闭它。
或者,如果出于某种原因,我们想坚持使用纯shell:
./date.sh | while IFS= read -r line; do printf "%s\n" "$line" >>date.log; done &
https://stackoverflow.com/questions/38671556
复制相似问题