我正在尝试截断一个文件,用于重定向标准输出。例如:
ping localhost>/tmp/test.log
如果我调用rm /tmp/test.log
,则重定向停止,但命令有效。
如果我调用truncate -s0 /tmp/test.log
或>/tmp/test.log
或echo ..
和等,重定向有效,但文件包含前导零,因为流位置没有改变。
我怎样才能截断该文件?
答案1
未雨绸缪:
- 如果文件存在,则截断或删除它。
- 使用
>>
而不是>
。
这样,您将利用>>
本质上“始终寻找文件末尾”的事实,同时>
保持指向最后写入位置的指针。
然后你可以截断文件并>>
会遵守。参见我的这个答案,它会调查您所需要的确切行为。
答案2
在回答这个问题之前,您需要了解 Unix 文件系统。
唯一rm
能做的就是删除文件姓名,实际上是从目录结构指向磁盘块的指针。
当你跑步时
ping localhost > /tmp/test.log
rm /tmp/test.log
重定向不会停止。命令会继续运行,数据会继续在磁盘区域累积。您根本无法访问这些数据,因为您已删除其名称。
您可以自由创建一个名为的完全不相关的文件/tmp/test.log
。
正如您所指出的,通过尝试截断文件,您会删除曾经存在的数据,但内部文件描述符知道它指向的文件中的位置,并在文件末尾写入扩展文件。因此前导零。
如果您想“重置”重定向,那么您需要终止程序ping
,删除或截断/tmp/test.log
文件,然后重新启动该ping
程序。
你也可以使用类似rotatelogs
ping localhost | rotatelogs ping.out.%Y%m%d.%H%M 600
根据经过的时间或文件的大小轮换日志文件。