2010-10-08 99 views

回答

17

在所有情况下,该文件将被截断。这是因为重定向是由shell处理的,它在调用该命令之前打开要写入的文件。

cat foo > foo 

外壳截断和写作打开FOO,标准输出设置为文件,然后Exec的["cat", "foo"]

GNU猫很聪明,拒绝将文件重定向到它自己。它通过检查输入和输出文件描述符上的设备/ inode对来完成;您可以阅读src/cat.c中精彩的底层细节。它打印一条消息并退出。

BSD猫没有这样的安全性,但由于文件已被截断,没有东西可读,没有什么可写的,它会停下来。


你可以通过追加而不是截断来使事情增加一点点。

echo hello > foo 
cat foo >> foo 

现在一切都是一样的,除了shell打开文件进行追加而不是截断它。

GNU猫看到你在做什么,并停止;该文件是未触及的。

BSD cat进入一个循环并将文件附加到自身,直到磁盘填满。

+0

这就是为什么Mac建立在BSD上的原因。 – 2017-05-18 10:50:49

2

该文件首先被截断然后读取,因此该命令会截断该文件。

当我试图执行它我得到了这样的警告:

猫:test.txt的:输入文件输出文件

+0

你有什么平台的'猫'? 'cat foo> foo'产生一个空的'foo'文件给我。 – birryree 2010-10-08 04:51:32

4

在Fedora 13,这是我所看到的

cat foo > foo 
cat: foo: input file is output file 

如果foo以前包含任何内容,则消失。

1

壳牌将截断,cat显然是检查一个名为PARM,但不会核对stdin如下始终成功:

$ uname -a 
Linux bar 2.6.18-164.15.1.el5PAE #1 SMP Wed Mar 17 12:14:29 EDT 2010 i686 i686 i386 GNU/Linux 
$ dd if=/dev/urandom of=foo bs=1024 count=4 
4+0 records in 
4+0 records out 
4096 bytes (4.1 kB) copied, 0.00334456 seconds, 1.2 MB/s 
$ od -c foo |head -2 
0000000 U 371 003 z 224 334 z K 236 221 k  < c 256 ! 
0000020 % % 256 V \ 005 , 254 X 202 330 004 222 " 037 226 
$ cat <foo >foo && od -c foo 
0000000 
+0

感谢您的回复。他们都很有帮助。 – HelloWorld 2010-10-08 05:48:52