UNIX痛恨者手册:cpp预处理删文件机制
写一个程序, 例如a.c, 里边用了宏, 宏在别的目录下的头文件中定义, 用-I指定。调试时, 发现宏替换存在问题, 于是用cpp查看预处理输出, cpp也接受-I选项, 就象gcc一样。 于是, 故事开始了:
1, cpp -I ……/headers/ a.c问题是, 我一下子忘了敲那个-I选项了!! 于是事实上的命令就是这样:cpp ……/headers/ a.c输出:cc1: error: headers/: 没有那个文件或目录
2, 我马上意识到自己的错误操作, 更正为:cpp -I ……/headers/ a.c输出:[root@localhost ~]# cpp -I ……/headers/ a.c cpp: a.c:没有那个文件或目录cpp: 没有输入文件
嗯? a.c也不见了? 不可能啊。 ls一下, 嘿, 还真的不见了! 百思不得其解, 用strace跟踪一下cpp ……/headers/ a.c,看看它都干了些什么:
3, strace cpp ……/headers/ a.c最后几行的输出:
QUOTE:vfork() = 4450 waitpid(4450, cc1: error: headers/: 没有那个文件或目录[{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0) = 4450―― SIGCHLD (Child exited) @ 0 (0) ――stat64("a.c", {st_mode=S_IFREG|0644, st_size=0, ……}) = 0 unlink("a.c") = 0 exit_group(1) = ? CODE:NAME cpp - The C Preprocessor
SYNOPSIS cpp [-Dmacro[=defn]……] [-Umacro] [-Idir……] [-Wwarn……] [-M│-MM] [-MG] [-MF filename] [-MP] [-MQ target……] [-MT target……] [-P] [-fno-working-directory] [-x language] [-std=standard] infile outfile
Only the most useful options are listed here; see below for the remain- der.如果你不输入 -I 的话,那么第一个参数 ……/headers/ 是输入文件,第二个参数 a.c 是输出文件。
这样你的文件就会被删除。
和 gcc -o ttt.c ttt 的原理一样,请看“UNIX 痛恨者手册”,类似的还有
CODE:rm *.o因为 * 号需要按 shift 键,所以如果你的手指不太协调或者键盘不太灵光的话,按后面的小数点的时候,也许 shift 还没有松开,于是就变成了
CODE:rm *>o恭喜你!
UNIX 将删除你所有的文件,并且为你生成一个名为 o 的空文件。