You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本中ls重定向输出文件提前创建的原因及解决方法

为什么directoryContents.txt会被ls命令列出来?

这是个很典型的shell执行流程问题,我来给你拆解一下:

原因:Shell先处理重定向,再执行命令

当你运行这个脚本时,bash不会先执行ls再写文件——它的处理顺序是反过来的:

  1. 首先识别到> ./directoryContents.txt这个重定向操作,立刻创建(如果不存在)或者清空(如果已存在)directoryContents.txt文件;
  2. 然后才会启动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:11:26