当命令的输出被重定向到文件时,在执行命令之前shell会创建或截断输出文件,知道cat foo> foo的作用吗?
Jos*_*Lee 17
在所有情况下,文件都被截断.这是因为重定向由shell处理,它在调用命令之前打开文件进行写入.
cat foo > foo
Run Code Online (Sandbox Code Playgroud)
shell会截断并打开foo进行写入,将stdout设置为文件,然后执行exec ["cat", "foo"].
GNU cat很聪明,拒绝将文件重定向到自身.它通过检查输入和输出文件描述符上的设备/ inode对来完成此操作; 你可以在src/cat.c中阅读精彩的低级细节.它打印一条消息并退出.
BSD cat没有这样的安全性,但由于文件已被截断,因此没有什么可读,没有什么可写的,它会停止.
你可以通过追加而不是截断来增加一些东西.
echo hello > foo
cat foo >> foo
Run Code Online (Sandbox Code Playgroud)
现在一切都是一样的,除了shell打开文件以追加而不是截断它.
GNU猫会看到你在做什么和停止; 该文件未被触及.
BSD cat进入循环并将文件附加到自身,直到磁盘填满为止.