bash追加到循环内外的文件

时间:2015-05-07 22:26:19

标签: bash

这两个命令有什么区别?

while true; do date; sleep 1; done > /tmp/log

VS

while true; do date >> /tmp/log; sleep 1; done 

两者都追加到一行一行,但似乎两者都采用不同的方式。

我认为第一个不会附加任何文件,因为整个附加到文件将在循环结束后发生,并且因为循环是无限的,所以不会将任何内容写入文件。 当只使用一个>时,第一个如何附加到文件?

3 个答案:

答案 0 :(得分:2)

第一个命令

while true; do date; sleep 1; done

被视为"块"。任何阻止输出的内容都会打印到stdout。您只需将该块的输出重定向到文件。

想象一下,您有以下shell脚本:

#!/bin/bash
while true; do date; sleep 1; done

现在你跑了

script.sh > /tmp/log

您还希望将日志文件连续写入。

答案 1 :(得分:2)

在版本1中,输出会立即添加到文件中,因为date命令会在退出时刷新其输出,这会将所有内容写入标准输出文件。

版本1不会附加到文件中。它在循环启动时打开文件的文件描述符,并在发生这种情况时清空文件。此描述符对整个循环保持打开状态,并由循环中的每个命令作为其标准输出继承。由于它没有在每个命令之前关闭并重新打开,因此每次都不会截断文件 - 它们只是写入文件中的当前位置。

答案 2 :(得分:1)

此命令:

while true; do date; sleep 1; done > /tmp/log

立即打开文件(循环甚至运行之前)(并截断文件中的任何现有内容),循环内运行的命令继承打开文件描述符(fd),任何输出都写入该文件输出发生了。

此命令:

while true; do date >> /tmp/log; sleep 1; done

每次循环打开文件一次(紧接在运行date命令之前)。 >>运算符以追加模式打开文件,因此不会截断现有文件内容。