如何在删除后自动创建bash脚本的日志文件

时间:2016-07-30 07:38:22

标签: linux bash shell

我有一个bash脚本文件 date.sh

#!/bin/bash
while true
do
  sleep 1
  echo "date------ "$(date)
done

我跑吧

$ ./date.sh >> date.log 2>&1 &

我可以在那里看到date.log并进行更新,但在我删除后,它不会被自动创建,即使我手动重新创建它,文件也不会更新,我想要日期.log将被自动创建并在删除后进行更新。

1 个答案:

答案 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 &