关于LINUX CAT命令

来源:百度知道 编辑:UC知道 时间:2024/09/25 01:25:04
有一个文件f1.c ,这个命令#cat < f1.c > f1.c 为什么能把文件f1清空了?不太明白,请各位赐教?

楼上的 f1.c清空的原理讲的正确 但是
$ cat < f1.c >> f1.c
会造成死循环 ,瞬间会造成巨大的文件 , 不要误导人了 呵呵

lz 要想明白这个 一定要了解<的到底是干什么的
对于你的命令 cat < f1.c > f1.c 表示
cat 命令以 f1.c 文件作为 stdin,同时以 f1.c 文件作为 stdout
一般的 ,linux中的文件都有一个标记叫做EOF ,End of File ,此标记表示为文本结束符 ,这样一来 f1.c的文件尾部就是EOF , 执行最后一步的重定向时 就将EOF重定向到了 f1.c ,这样 直接将一个EOF重定向到文件的时候表示将文件清空

其实你的命令等效于

$ cat << EOF > f1.c
>EOF

对于stdin来讲 它是忠实的呈现来源的各个字节的

这个例子没什么实用价值 也就是让人了解 < >的功能以及特点, 逻辑上来讲 从一个文件读入在重新输出到文件本身有什么意思呢.

原因很简单,这个跟cat无关,是shell的问题:

> f1.c 表示如果f1.c不存在则创建该文件,如果存在就把该文件清空。也就是说shell在分析这个命令时,首先去判断f1.c存在否,在本例中它是存在的,所以shell把该文件清空,然后再把f1.c作为cat的标准输入和标准输出,其实cat拿到这个f1.c文件时,它已经是空的了

再说说 >> f1.c 这种,自己分析一下,先不要在电脑上面试,您能够分析出结果吗,分析出结果后再在电脑上面试,看分析结果是否跟实践结果一样,如果是,恭喜,搜获不小。如果没有分析对,也没啥,根据实践结果在回头来仔细理解,终会有所得!

应该和cat命令的处理机制有关,cat一行行的读取f1.c,然后一行行的重定向到f1.c,到最后就是文件结尾的空标志重定向到了f1.c,没有其他内容了,所以空了。
#cat < f1.c >> f1.c,有