web-dev-qa-db-ja.com

スペースを含むbash変数

私は、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

これに対する解決策はありますか(前に言及したもの以外)?

すべてのリンク/ヒントをいただければ幸いです。

ありがとう、

ユリアン

29
INS

次のように実行します:"$VAR"。これは、シェルスクリプトで最も重要な落とし穴の1つです。文字列は常に文字どおりに置換され、含まれるスペースは文字列の文字としてではなくトークン区切り文字として扱われるためです。変数を実行時に貼り付ける一種のコードと考えてください。

$VARは、シェルがバイナリを実行しようとすることです/c/Program最初の引数Files/TortoiseGit/bin/TortoisePlink.exe

特定の入力に対して大きなシェルスクリプトで奇妙な構文エラーを取得することで、この難しい方法を学びました。ランタイム入力に特殊文字が含まれている場合、他の言語では構文エラーを訴えることはできませんが、bashやshなどのコマンドインタープリターがコードを1行ずつ解釈するため、これがシェルスクリプトの性質です。

文字列にスペースが含まれることが予想され、それを個別のトークンとして扱いたくない場合は、二重引用符で囲みます。

51

参考までに、引数をエスケープされた引用符でカプセル化することにより、osxで同様の問題を解決しました。これは最善の解決策ではないかもしれませんが、うまくいくようです。

alias sub="\"/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl\""
9
Alex

スペースをエスケープするバックスラッシュを含めることで解決しました:

/Program Files/Program\ Filesになります

例:

export GIT_SSH=/c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe

2
Eduard Dubilyer

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でスペースを実際にサポートしていません。
ただし、NULLlpApplicationNameとして渡すことはサポートされているため、lpCommandLineの(おそらく引用符で囲まれた)最初の引数からアプリケーションを把握できます。

そのトリックを使用して(最初の引数が実行可能ファイルのパスに一致することが確実な場合)、パスにスペースが含まれるプログラムの起動をサポートしましょう。

これにより _git-for-windows/git_ issue 692 が修正されます

0
VonC