gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:35 25 4
gpt4 key购买 nike

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

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

我运行它

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

我可以在那里看到一个 date.log 并且正在更新,但是在我删除它之后,它不会自动创建,即使我手动重新创建它,文件也不会更新,我希望 date.log 是自动的在删除后创建和更新。

最佳答案

在此代码中,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 &

关于linux - 如何在删除后自动创建 bash 脚本日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38671556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com