终端可运行的Bash脚本作为文件执行时终止异常求助
问题:Bash脚本处理大文本时停滞无法结束
停滞原因
- 大文本变量的字符串替换效率极低:你将整本《哈利·波特与魔法石》的内容读入Bash变量
harry1,随后用${harry1//wand/butt}这类参数展开做替换。Bash对超大字符串的内存处理和替换操作性能极差,会占用大量CPU和内存,导致脚本长时间无响应,看起来像是停滞。 - 终端输出大文本的瓶颈:即便替换完成,
echo "$harry1_butt"将几十万字的内容直接输出到终端时,终端的渲染速度远跟不上输出速度,也会造成脚本“卡住”的假象。
解决方法
避免将大文本存入Bash变量,改用管道流+文本处理工具直接处理文件,全程流式操作,不加载完整文本到内存:
修改后的脚本
#!/bin/bash # 清理历史输出文件(可选,避免重复执行时的内容干扰) rm -f output_file.txt final_output.txt # 爬取目标文本,curl会自动创建output_file.txt,无需提前touch curl 'https://archive.org/stream/joannek.rowlingharrypotterbook1harrypotterandthephilosophersstoneenglishonlineclub.com/Joanne%20K.%20Rowling%20%28Harry%20Potter%2C%20Book%201%29%20-%20Harry%20Potter%20and%20the%20Philosophers%20Stone%20%5BEnglishOnlineClub.com%5D_djvu.txt' -o "output_file.txt" # 解析+清理标签+替换关键词,全程用管道串联,流式处理 tr "\n" "|" < output_file.txt \ | grep -o '<pre>.*</pre>' \ | sed 's/\(<pre>\|<\/pre>//g;s/|/\n/g' \ | sed 's/<[^>]*>//g' \ | sed -e 's/wand/butt/g' -e 's/buttering/wandering/g' \ > final_output.txt # 用分页工具查看结果,避免终端渲染卡顿 less final_output.txt # 若需直接输出到终端,也可使用cat,但建议优先用less # cat final_output.txt
优化说明
- 去掉了冗余的
touch output_file.txt,curl的-o参数会自动创建目标文件。 - 用管道串联所有处理步骤,每个工具仅处理当前流的部分内容,无需加载完整文本到内存,性能大幅提升。
- 将多次sed操作合并,减少进程启动开销,同时保持逻辑清晰。
- 用
less代替echo输出结果,既避免终端渲染卡顿,又支持分页浏览大文本。
内容的提问来源于stack exchange,提问作者burble_gurp007
相关产品推荐
相关产品推荐

