在UNIX中,"cat file1> file1有什么用?"

Hel*_*rld 16 unix redirect

当命令的输出被重定向到文件时,在执行命令之前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进入循环并将文件附加到自身,直到磁盘填满为止.