如何将 shell 标准输出重定向到文件的第一行?

Mat*_*hew 7 shell bash

shell标准输出重定向到文件的最后一行,有没有办法把它写到文件的第一行?

由于stdout的内容是不可预测的,我怀疑这可能需要改变stdout的默认行为,但我不确定它是否可行。

示例,将时间戳重定向到文件

echo `date` >> test.txt
Run Code Online (Sandbox Code Playgroud)

默认保存到文件的最后一行

Mon Aug 31 00:40:27 UTC 2020
Mon Aug 31 00:40:28 UTC 2020
Mon Aug 31 00:40:29 UTC 2020
Mon Aug 31 00:40:30 UTC 2020
Run Code Online (Sandbox Code Playgroud)

想要的效果,将输出保存到文件的第一行

Mon Aug 31 00:40:30 UTC 2020
Mon Aug 31 00:40:29 UTC 2020
Mon Aug 31 00:40:28 UTC 2020
Mon Aug 31 00:40:27 UTC 2020
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Joh*_*024 20

要将日期写到开头而不是结尾file,请尝试:

{ date; cat file; } >file.new && mv file.new file
Run Code Online (Sandbox Code Playgroud)

讨论

  1. 在文件开头添加新文本需要重写整个文件。将新文本添加到文件末尾只需要写入新文本。

  2. 安迪·道尔顿( Andy Dalton ) 的建议是像平常一样追加到文件的末尾,然后tac file用来查看文件,这是一个很好的建议。

  3. echo `date` >> test.txt可以用更简单、更高效的方式代替date >> test.txt

    如果使用 bash 4.3 或更高版本,那么正如Charles Duffy指出的那样,printf '%(%c)T\n' -1 >>test.txt效率仍然更高。

  4. 花括号周围的空间是必不可少的。这是因为{and}是 shell保留字(与不需要空格的shell关键字相反)。

  • 如果使用 bash 4.3 或更高版本,`printf '%(%c)T\n' -1 >>test.txt` 甚至比 `date >>test.txt` 更有效。 (2认同)

Siv*_*iva 12

尝试使用sed

sed -i "1 i\
$(date)" test.txt
Run Code Online (Sandbox Code Playgroud)

形式man

i \
text 插入文本,每个嵌入的换行符前面都有一个反斜杠。