나는 내가 찾은 어떤 Linux diff 도구보다 더 나은 Windows diff 도구를 가지고 있습니다(그리고 나는 그것으로 몇 가지 멋진 작업을 수행했습니다).시각적 차이 도구의 광범위한 분석). 저는 이 도구를 Linux(Wine을 통해)에서 사용하고 Linux 파일 경로를 전달할 수 있기를 원합니다. 부분적으로는 Double Commander와 같은 이중 창 파일 관리자가 diff 도구를 호출할 때 전체 파일 경로를 자동으로 전달하기 때문입니다.
그래서 반대로 물어보는데이 문제: Linux 스타일 파일 경로(이스케이프 문자(예: 공백) 포함)를 Windows 스타일 파일 경로(Wine을 통해 실행되는 Windows 도구에서 허용됨)로 변환하는 방법은 무엇입니까?
간단한 예를 들자면,
입력하다:
/경로/to/file1.ext /경로/to/file2.ext
산출
“\경로\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 왼쪽 { winepath --windows $1 } 백틱 -i 오른쪽 { winepath --windows $2 } 여러 대체 { 중요한 것들 중요한 것은 옳은 것입니다 } 와인 /utils/wincmp.exe ${왼쪽} ${오른쪽}
답변2
언제나변수를 큰따옴표로 묶으면 공백이나 셸 메타문자에 신경 쓸 필요가 없습니다.
sed
또는 를 사용하여 s를 .eg 또는tr
로 변환할 수 있습니다 (참고: 쉘 이스케이프 문자이므로 리터럴 백슬래시로 처리하려면 이스케이프해야 합니다)./
\
sed 's:/:\\:g'
tr '/' '\\'
\
또는 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/와인 기반 도구는 Linux/UNIX 기반 개발 워크플로에 원활하게 통합되지 않습니다.
(개인적 으로 저는 diff -u
주로 . 내가 주로 사용하는 side-side diff ).colordiff -u
less
git diff
sdiff