私は、MinGW Shellの窓の下で次の問題に直面しています。私は私の/etc/profile
次の式:
export GIT_SSH="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"
ローカルリポジトリでgit fetchを使用すると、これは機能しません。しかし、私がそれを(古いdos方法)のように行うと、これは機能します:
export GIT_SSH="/c/Progra~1/TortoiseGit/bin/TortoisePlink.exe"
私の質問は:
変数にスペースを使用して機能させるにはどうすればよいですか?
テストの目的で、次のようなものをシミュレートできます(どの例でも良いです):
export VAR="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"
# and try to execute like this
$VAR
これに対する解決策はありますか(前に言及したもの以外)?
すべてのリンク/ヒントをいただければ幸いです。
ありがとう、
ユリアン
次のように実行します:"$VAR"
。これは、シェルスクリプトで最も重要な落とし穴の1つです。文字列は常に文字どおりに置換され、含まれるスペースは文字列の文字としてではなくトークン区切り文字として扱われるためです。変数を実行時に貼り付ける一種のコードと考えてください。
$VAR
は、シェルがバイナリを実行しようとすることです/c/Program
最初の引数Files/TortoiseGit/bin/TortoisePlink.exe
。
特定の入力に対して大きなシェルスクリプトで奇妙な構文エラーを取得することで、この難しい方法を学びました。ランタイム入力に特殊文字が含まれている場合、他の言語では構文エラーを訴えることはできませんが、bashやshなどのコマンドインタープリターがコードを1行ずつ解釈するため、これがシェルスクリプトの性質です。
文字列にスペースが含まれることが予想され、それを個別のトークンとして扱いたくない場合は、二重引用符で囲みます。
参考までに、引数をエスケープされた引用符でカプセル化することにより、osxで同様の問題を解決しました。これは最善の解決策ではないかもしれませんが、うまくいくようです。
alias sub="\"/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl\""
スペースをエスケープするバックスラッシュを含めることで解決しました:
/Program Files
は/Program\ Files
になります
例:
export GIT_SSH=/c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe
Git 2.23(2019年第3四半期、8年後)では、_GIT_SSH
_を_/c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe
_に設定すると...(まだWindows 7を使用している場合)動作します!
commit eb7c786 (2019年7月16日) Johannes Schindelin(dscho
) を参照してください。
( C浜野潤夫-gitster
- in commit a5194d8 、2019年7月25日)
mingw
:名前にスペースを含むプログラムの生成をサポート一部の古いバージョンのWindows(Windows 7など)では、
CreateProcessW()
関数は最初の引数lpApplicationName
でスペースを実際にサポートしていません。
ただし、NULL
をlpApplicationName
として渡すことはサポートされているため、lpCommandLine
の(おそらく引用符で囲まれた)最初の引数からアプリケーションを把握できます。そのトリックを使用して(最初の引数が実行可能ファイルのパスに一致することが確実な場合)、パスにスペースが含まれるプログラムの起動をサポートしましょう。
これにより _
git-for-windows/git
_ issue 692 が修正されます