私は私が見つけたLinux diffツールよりも優れたWindows diffツールを持っています(そして私はそれでいくつかの素晴らしい仕事をしました)。視覚差異ツールの広範な分析)。私はこのツールをLinux(Wine経由)で使用し、Linuxファイルパスを渡すことを望んでいます。これは、Double Commanderなどのデュアルウィンドウファイルマネージャがdiffツールを呼び出すときにファイルパス全体を自動的に渡すためです。
だから反対に尋ねます。この問題:Linuxスタイルのファイルパス(エスケープ文字(スペースなど)をWindowsスタイルのファイルパス(Wine経由で実行されているWindowsツールで許可されています)に変換するには?
簡単な例を挙げると、
入力する:
/パス/to/file1.ext /パス/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 左 { 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
主に。私が主に使用するサイドサイドディフ)。colordiff -u
less
git diff
sdiff