如何在命令中使用文件并将输出重定向至同一文件且避免截断?
嘿,这俩问题其实都是关于重定向时避免文件截断的经典场景,我来给你捋清楚靠谱的解决办法:
问题1:如何在命令中使用文件同时将输出重定向到该文件且不截断原内容?
直接写command your_file > your_file绝对踩坑——shell执行命令前就会先打开目标文件并截断它,等命令去读取这个文件的时候,内容已经是空的了,最后输出自然也白给。这里有两个实用方案:
用
sponge工具(推荐):
这个工具来自moreutils包,大部分Linux发行版可以通过包管理器(比如apt install moreutils或yum install moreutils)安装。它的作用是先把命令输出全部读进内存,等命令执行完再写入目标文件,完美避开截断问题:command your_file | sponge your_file用法简单直观,日常处理文件修改特别顺手。
用变量暂存内容(无需额外安装):
不想装工具的话,先把文件内容读到变量里,处理完再写回去就行:# 把文件内容读进变量(记得加双引号保留格式) file_content=$(cat your_file) # 执行你的命令处理内容 new_content=$(echo "$file_content" | your_command_here) # 写回原文件 echo "$new_content" > your_file重点是给变量加双引号,不然会丢失换行、空格这些格式信息。
问题2:避免截断package.yaml,有没有替代临时文件的方案?
必须有!除了上面的sponge和变量方法,还有针对文本处理的专属技巧:
用工具的原地编辑功能:
像sed这类常用文本处理工具自带原地编辑选项,比如sed的-i参数:# 比如替换package.yaml里的某个字段,原地修改不截断 sed -i 's/old_value/new_value/g' package.yaml它会在后台自动创建临时文件处理内容,搞定后直接替换原文件,你不用手动管临时文件,也不会出现截断问题。
变量暂存方案(通用所有场景):
如果是自定义命令或者复杂处理逻辑,变量法依然万能:# 读取package.yaml的内容 yaml_content=$(cat package.yaml) # 执行你的自定义处理,比如过滤、转换等 processed_yaml=$(echo "$yaml_content" | your_custom_command) # 把处理后的内容写回文件 echo "$processed_yaml" > package.yaml
内容的提问来源于stack exchange,提问作者Chris Stryczynski
相关产品推荐
相关产品推荐

