Bash脚本中ls重定向输出文件提前创建的原因及解决方法
为什么
directoryContents.txt会被ls命令列出来? 这是个很典型的shell执行流程问题,我来给你拆解一下:
原因:Shell先处理重定向,再执行命令
当你运行这个脚本时,bash不会先执行ls再写文件——它的处理顺序是反过来的:
- 首先识别到
> ./directoryContents.txt这个重定向操作,立刻创建(如果不存在)或者清空(如果已存在)directoryContents.txt文件; - 然后才会启动
ls命令,遍历当前目录的内容。
这时候directoryContents.txt已经存在于当前目录里了,自然会被ls的结果包含进去,最终又被写入到这个文件里。
简便的解决办法
这里有几个实用的方案,你可以根据场景选择:
把输出写到当前目录之外:
比如写到上级目录或者系统临时目录,这样ls遍历当前目录时就不会碰到它:#! /bin/bash ls > ../directoryContents.txt用临时文件中转:
先把ls的结果存到一个不在当前目录的临时文件,再移动到目标位置:#! /bin/bash ls > /tmp/temp_ls_output.txt mv /tmp/temp_ls_output.txt ./directoryContents.txt过滤掉目标文件名:
如果一定要写到当前目录,可以用grep排除掉目标文件的名字:#! /bin/bash ls | grep -v "^directoryContents.txt$" > ./directoryContents.txt注意:这个方法会排除所有同名文件,如果之前脚本运行过留下了旧的
directoryContents.txt,也会被过滤掉。
内容的提问来源于stack exchange,提问作者Awesome13
相关产品推荐
相关产品推荐

