Unix中I/O重定向疑问:cat命令重定向异常问题
为什么
cat hello.txt world.txt > world.txt会得到重复内容? 哈哈,这个问题我刚接触Unix命令行的时候也踩过同款坑!咱们来拆解一下到底发生了什么:
核心原因:Shell先处理重定向,再执行命令
Unix shell的执行逻辑是先解析并处理所有重定向操作,再运行命令本身,这就是问题的根源:
- 当你输入
cat hello.txt world.txt > world.txt时,shell第一步就会处理> world.txt:它会打开world.txt(如果不存在就创建),并且立刻清空文件里的所有内容。 - 等shell处理完重定向,才会启动
cat命令。这时候cat要依次读取两个输入文件:hello.txt和world.txt。cat先读取hello.txt的内容,把它写入到已经被清空的world.txt里;- 接着
cat去读取world.txt,但这时候world.txt已经有了刚写入的hello.txt内容,于是cat会把这部分内容再读一遍,又写入到world.txt里。
- 最终
world.txt里就会有两份hello.txt的内容,也就是你看到的重复情况。
正确的做法
根据你的需求,分几种情况处理:
- 如果只是想把
hello.txt的内容覆盖到world.txt,直接用:cat hello.txt > world.txt - 如果想把
hello.txt的内容追加到world.txt末尾,用追加重定向>>:cat hello.txt >> world.txt - 如果确实需要合并多个文件(包括
world.txt本身)到world.txt里,为了避免上述问题,可以先把内容写到临时文件,再替换目标文件:cat hello.txt world.txt > temp.txt && mv temp.txt world.txt
内容的提问来源于stack exchange,提问作者Samun
相关产品推荐
相关产品推荐

