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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:28:11