我有一个 Windows diff 工具,它比我发现的任何 Linux diff 工具都要好(并且我已经做了一些漂亮的工作)对视觉差异工具的广泛分析)。我想在 Linux 上使用该工具(通过 Wine),并且能够将 Linux 文件路径传递给它,部分原因是像 Double Commander 这样的双窗格文件管理器在调用 diff 工具时会自动传递完整的文件路径。
所以我问的是相反的这个问题:如何将 Linux 样式的文件路径(包括转义字符(例如空格))转换为 Windows 样式的文件路径(通过 Wine 运行的 Windows 工具可以接受)?
举个简单的例子,
输入:
/path/to/file1.ext /path/to/file2.ext
输出
“\path\to\file1.ext” “\path\to\file2.ext”
当然,在现实世界中,文件可以有空格之类的,所以我正在寻找一个比bash
迄今为止的替代更可靠的解决方案:
#!/bin/bash
p1=$1
p2=$2
wine /utils/wincmp.exe ${p1//\//\\} ${p2//\//\\}
答案1
你的剧本实际上非常接近。您所需要的只是winepath
作为 WINE 一部分提供的工具来进行转换:
#!/bin/sh exec wine /utils/wincmp.exe "`winepath --windows \"$1\"`" "`winepath --windows \"$2\"`"
或者使用洛朗·贝尔科特execline
:
/命令/execlineb -S2 反引号-i left { winepath --windows $1 } 反引号 -i 右 { winepath --windows $2 } 多重替代{ 重要 左 左 重要的是正确的 } 葡萄酒 /utils/wincmp.exe ${左} ${右}
答案2
总是双引号你的变量,这样你就不需要关心空格或 shell 元字符。
您可以使用
sed
或tr
将/
s 转换为\
.例如sed 's:/:\\:g'
ortr '/' '\\'
(注意:因为\
是 shell 转义字符,所以需要转义才能将其视为文字反斜杠)。或者,bash 的字符串操作运算符也可以完成这项工作(但不是 posix 标准,因此不可移植)。您犯的唯一错误是没有引用变量。
但请注意,正如@Michael Homer 所提到的,不需要修改路径分隔符......我wine program.exe /unix/path/to/file
过去运行当然没有困难。
导致:
#!/bin/bash
p1="$1"
p2="$2"
# optional transformation
p1="$(printf "%s" "$p1" | tr '/' '\\')"
p2="$(printf "%s" "$p2" | tr '/' '\\')"
wine /utils/wincmp.exe "$p1" "$p2"
或者
#!/bin/bash
p1="${1//\//\\}"
p2="${2//\//\\}"
wine /utils/wincmp.exe "$p1" "$p2"
甚至:
#!/bin/bash
wine /utils/wincmp.exe "${1//\//\\}" "${2//\//\\}"
(但是最后一个版本没有给您任何机会对文件参数进行健全性检查,或进行任何类型的选项处理 - 例如 with getopts
)
最后,您可能需要重新考虑您对 Windows diff 工具的偏好,或者至少在做出决定之前进行更彻底的调查(您只评估了一小部分可用工具和 GUI 包装器)。基于 Windows/wine 的工具无法顺利集成到基于 Linux/UNIX 的开发工作流程中。
(就我个人而言,我主要使用diff -u
或colordiff -u
通过管道连接到less
。鉴于我正在处理文本文件,因此不需要 GUI 界面。它也与我从git diff
etc 获得的内容相同。在极少数情况下,我需要并排- side diff,我主要使用sdiff
)。