Thunar自定义diff比较功能中xclip输出适配diff的问题求解
之前的写法失效原因拆解
第一种拼接引号写法的问题
你在变量展开时主动插入双引号的做法不符合shell的解析规则:
- shell对命令参数的引号解析优先级高于变量展开,变量展开后出现的
"只会被识别为文件名的普通字符,不会起到分隔参数、标记路径边界的作用 - 你把替换后的整段内容又套了一层双引号,等于直接把两行路径拼接后的所有内容当成单个参数传给
diff,自然会被识别为同一个文件名
第二种循环写法的问题
有4处核心逻辑错误:
- 管道
echo "$selected"| while ...触发了子shell执行,你在循环内对compare变量的赋值只会作用于子shell,循环结束后父shell的compare变量仍然是空值 - 你把
compare定义为普通字符串而非数组,后续用${compare[0]}、${compare[1]}取数组索引的写法完全无效,只能拿到空值 - 循环内每读入一行路径就执行一次
diff,第一次循环时compare只有1个路径参数,diff会直接因为参数不足报错 - 拼接路径时手动转义空格、最后用无引号的
${compare}传参的写法,会触发shell的分词和通配符展开,只要路径包含空格、特殊字符(如*、?、换行)就会彻底失效
可选优化方案
你现在用head/tail的方案可以正常工作,如果你需要兼容路径含换行的极端场景,可以用mapfile直接把剪切板内容读入数组,写法更简洁也更安全:
# 把剪切板输出按行读入数组,自动去掉行尾换行符 mapfile -t selected < <(xclip -selection clipboard -o) # 直接取数组前两个元素传给diff,输出传给xmessage xmessage "$(diff -qyr "${selected[0]}" "${selected[1]}")"
内容的提问来源于stack exchange,提问作者Lerian Acosenossa
相关产品推荐
相关产品推荐

