Ubuntu WSL中使用fzf与EFF词表的Bash脚本出现异常字符串拼接问题
解决WSL 22.04中bash脚本输出错乱的问题
这个问题我碰到过!根源是Windows和Linux的换行符差异搞的鬼,具体来说是你的词表文件用了Windows的CRLF(\r\n)换行,而不是Linux的LF(\n)换行,在WSL环境里这个隐藏的回车符(\r)会直接搞乱终端输出逻辑。
当你用awk提取$2时,每个单词后面其实带了一个看不见的\r字符。当你echo这个变量时,\r会让终端光标直接跳回当前行的开头,后续输出的内容就会覆盖掉前面的内容——这就是你看到,elkal和,elk-phrase: animal这类错乱输出的核心原因。
快速修复方案
有两种简单的解决方式,选一个就行:
1. 转换词表文件为Linux换行格式
直接把词表文件的换行符改成Linux标准的LF:
# 先安装dos2unix(如果没装的话) sudo apt install dos2unix # 转换文件 dos2unix eff_short_wordlist_2_0.txt # 没有dos2unix的话用sed替代 sed -i 's/\r$//' eff_short_wordlist_2_0.txt
2. 在脚本中直接清理回车符
如果不想修改源文件,可以在提取单词时就去掉隐藏的\r:
修改脚本里的单词提取逻辑,二选一即可:
# 方式A:awk处理时直接去掉回车符 word1=$(awk '{sub(/\r$/,"",$2); print $2}' eff_short_wordlist_2_0.txt | fzf) # 方式B:用tr命令清理fzf的输出 word1=$(awk '{print $2}' eff_short_wordlist_2_0.txt | fzf | tr -d '\r')
把两个单词的提取逻辑都改成上面任意一种,脚本就能正常输出了。
为什么原生Ubuntu没问题?
因为原生Ubuntu环境下,下载的文件默认会用LF换行,或者系统会自动识别并处理CRLF格式的文件;而WSL如果挂载了Windows的文件系统(比如把词表存在/mnt/c下),或者下载时没有自动转换换行符,就会保留Windows的CRLF格式,从而触发这个问题。
内容的提问来源于stack exchange,提问作者Wisteso




