当命令的输出被重定向到一个文件时,输出文件在命令执行前被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. unix中的cat文件名和cat <filename的区别
- 5. perl中的字符串中的cat命令在引号中做了什么?
- 6. -batch标志在Emacs(或一般的unix)中做了什么?
- 7. “+”在CSS中做了什么?
- 8. %%在printf中做了什么?
- 9. *在CSS中做了什么?
- 10. 推出了CAT命令UNIX到Dockerfile
- 11. Unix的cat命令和FIFO
- 12. Unix cat -n命令执行
- 13. logging.basicConfig做了什么?
- 14. select {}做了什么?
- 15. perl中的~~做了什么?
- 16. scalaz中scalaz.syntax.std.OptionOps.cata做了什么?
- 17. 我在做什么错了?
- 18. `tf.strided_slice()`做了什么?
- 19. L做了什么?
- 20. 什么做错了?
- 21. @synchronized()做了什么?
- 22. class_initialize()做了什么?
- 23. 以下是做什么:(一些命令)> file1 file2
- 24. Cat和粘贴变量UNIX
- 25. “..”在Meteor Spacebars声明中做了什么?
- 26. “navbar-header”类在Bootstrap中做了什么?
- 27. apc.preload_path在APC设置中做了什么?
- 28. 'el'在view.render()中做了什么?el?
- 29. rootmodifers在famo.us中做了什么?
- 30. --stdlayout在git svn clone中做了什么?
我怀疑这将是shell的行为的一个非常好的测试。 – 2010-10-08 04:48:39