为什么我不能使用 `head` 修剪文件?

can*_*lin 3 io-redirection head

给定一个文件 foo.txt:

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

假设我们要将其更改为包含:

1
2
3
Run Code Online (Sandbox Code Playgroud)

为什么head -n3 foo.txt > foo.txt将 foo.txt 留空?

Ser*_*rge 10

发生这种情况是因为>重定向发生在head程序启动之前。该>重定向截断如果存在该文件,所以当head被读它已经是空文件。

  • 好吧,首先bash(或您正在使用的shell)打开/创建它将用于重定向的文件。然后,它根据需要将当前使用的 stdin、stdout 和 stderr 文件描述符替换为它为重定向创建的文件描述符。然后它执行 `fork` 和 `exec` 系统调用以启动一个新进程,因此启动的进程重定向了标准文件。然后 bash 为自己恢复其原始文件描述符。这大致是发生了什么。 (3认同)
  • 不是将 `head` 的输出重定向到文件,你可以将它通过管道传输到 `tee`,如下所示: `head -n3 foo.txt | tee foo.txt`。`tee` 不会写入文件,直到它通过管道从 `head` 接收到数据。 (2认同)