当命令的输出重定向到文件时,输出文件会在执行命令之前由 shell 创建或截断,知道 cat foo > foo 会做什么吗?
最佳答案
在所有情况下,文件都会被截断。这是因为重定向是由 shell 处理的,它会在调用命令之前打开文件进行写入。
cat foo > foo
shell 截断并打开 foo 进行写入,将 stdout 设置为文件,然后执行 exec 的 ["cat", "foo"]
。
GNU cat 很聪明,拒绝将文件重定向到自身。它通过检查输入和输出文件描述符上的设备/ inode 对来实现这一点;您可以在src/cat.c中阅读精彩的底层细节。 。它打印一条消息并退出。
BSD cat 没有这样的安全性,但是由于文件已经被截断,所以没有东西可读,没有东西可写,并且它会停止。
<小时/>您可以通过附加而不是截断来让事情变得有趣一点。
echo hello > foo
cat foo >> foo
现在一切都一样了,只是 shell 打开文件进行追加而不是截断它。
GNU 猫看到你在做什么并停下来;文件未受影响。
BSD cat 进入循环并将文件追加到自身,直到磁盘填满。
关于redirect - 在 UNIX 中什么是 "cat file1 > file1 does?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3887771/