WSL Ubuntu环境下结合fzf与EFF词表的Bash脚本出现字符串拼接异常问题
WSL Ubuntu环境下结合fzf与EFF词表的Bash脚本出现字符串拼接异常问题
看起来你碰到了WSL 22.04下Bash脚本和fzf配合时的诡异字符串覆盖问题,我之前在WSL环境折腾终端工具的时候也踩过类似的坑,咱们来理清楚问题根源和解决办法:
先复盘下你的问题场景
你的脚本逻辑很清晰:从EFF短词表里取第二列,用fzf交互式选两个词,然后拼接成短语。在原生Ubuntu(包括VM)下完全正常,输出是符合预期的:
animal animal,elk Passphrase: animal,elk
但到了WSL的Ubuntu 22.04里,输出直接乱成一锅粥:
animal ,elkal ,elk-phrase: animal
而且不管是剪控制字符、展开子shell都不管用,第二个词好像硬要跳转到行首覆盖前面的内容——这典型是终端控制字符搞的鬼。
问题根源分析
这大概率是fzf在WSL环境下输出的内容带了回车符(\r,也就是CR)。原生Linux终端只用换行符\n(LF)来换行,但WSL是跑在Windows终端之上的,有时候工具会误输出CRLF格式的内容。当变量里带了\r,终端输出到这的时候,光标会直接跳回行首,后面的字符就会把前面的内容给覆盖掉——这就是你看到animal变成,elkal的原因:elk\r输出时,\r让光标回到行首,elk覆盖了anim,就变成了,elkal。
解决办法:提前清理回车符
之前你清理控制字符没生效,大概率是清理的时机不对——应该在刚拿到fzf的输出时就立刻清理,而不是等拼接之后再处理。直接在fzf的输出管道后面加个清理回车符的步骤就行,给你两种最稳妥的写法:
写法1:用tr删除回车符
修改脚本里的变量赋值部分:
#!/bin/bash set -Eeu -o pipefail word1=$(awk '{print $2}' eff_short_wordlist_2_0.txt | fzf | tr -d '\r') echo "${word1}" word2=$(awk '{print $2}' eff_short_wordlist_2_0.txt | fzf | tr -d '\r') echo "${word1},${word2}" phrase="${word1},${word2}" echo "Passphrase: ${phrase}"
写法2:用sed去掉行尾的回车符
如果tr不好使,也可以用sed来精准删除行尾的\r:
word1=$(awk '{print $2}' eff_short_wordlist_2_0.txt | fzf | sed 's/\r$//') word2=$(awk '{print $2}' eff_short_wordlist_2_0.txt | fzf | sed 's/\r$//')
验证效果
修改完之后再运行脚本,应该就能得到和原生Ubuntu完全一致的输出了——光标不会再乱跳,两个词也能正常拼接成你想要的短语。
内容来源于stack exchange
相关产品推荐
相关产品推荐

