当命令的输出被重定向到一个文件时,输出文件在命令执行前被shell创建或截断,任何想法cat foo> foo都会做什么?在UNIX中,“cat file1> file1做了什么?”
回答
在所有情况下,该文件将被截断。这是因为重定向是由shell处理的,它在调用该命令之前打开要写入的文件。
cat foo > foo
外壳截断和写作打开FOO,标准输出设置为文件,然后Exec的["cat", "foo"]
。
GNU猫很聪明,拒绝将文件重定向到它自己。它通过检查输入和输出文件描述符上的设备/ inode对来完成;您可以阅读src/cat.c中精彩的底层细节。它打印一条消息并退出。
BSD猫没有这样的安全性,但由于文件已被截断,没有东西可读,没有什么可写的,它会停下来。
你可以通过追加而不是截断来使事情增加一点点。
echo hello > foo
cat foo >> foo
现在一切都是一样的,除了shell打开文件进行追加而不是截断它。
GNU猫看到你在做什么,并停止;该文件是未触及的。
BSD cat进入一个循环并将文件附加到自身,直到磁盘填满。
这就是为什么Mac建立在BSD上的原因。 – 2017-05-18 10:50:49
该文件首先被截断然后读取,因此该命令会截断该文件。
当我试图执行它我得到了这样的警告:
猫:test.txt的:输入文件输出文件
你有什么平台的'猫'? 'cat foo> foo'产生一个空的'foo'文件给我。 – birryree 2010-10-08 04:51:32
在Fedora 13,这是我所看到的
cat foo > foo
cat: foo: input file is output file
如果foo
以前包含任何内容,则消失。
壳牌将截断,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
感谢您的回复。他们都很有帮助。 – HelloWorld 2010-10-08 05:48:52
- 1. “mv file1 * .file1”是做什么的?
- 2. 在Groovy中执行Unix cat命令?
- 3. 在Unix中'-d'做什么?
- 4. “+”在CSS中做了什么?
- 5. logging.basicConfig做了什么?
- 6. 我在做什么错了?
- 7. perl中的~~做了什么?
- 8. scalaz中scalaz.syntax.std.OptionOps.cata做了什么?
- 9. `tf.strided_slice()`做了什么?
- 10. L做了什么?
- 11. 什么做错了?
- 12. class_initialize()做了什么?
- 13. @synchronized()做了什么?
- 14. 以下是做什么:(一些命令)> file1 file2
- 15. innerHTML在javascript中做了什么?
- 16. @字符在jQuery中做了什么?
- 17. extern在目标C中做了什么?
- 18. @ Component在angular2中做了什么
- 19. f.input在rails窗体中做了什么?
- 20. Attach()在Entity Framework中做了什么?
- 21. ccpClamp在Cocos2d中做了什么?
- 22. Android:NoActionBar在主题中做了什么?
- 23. LOWERCASE_EXPANDED_TERMS在Lucene中做了什么?
- 24. 我在模式中做错了什么?
- 25. bindToController在AngularJS 1.4中做了什么
- 26. Page()在Razor Page中做了什么?
- 27. if在[-n“$ {TEMP_FILE_LIST}”]中做了什么?
- 28. 在命令行中做了什么?
- 29. 在Angular 2中response.json()做了什么?
- 30. “12345”+ 2在C中做了什么?
我怀疑这将是shell的行为的一个非常好的测试。 – 2010-10-08 04:48:39