Bash variables with spaces

假如想象 提交于 2019-12-28 03:56:07

问题


I'm facing the next problem in MinGW shell under windows. I have in my /etc/profile the next expression:

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

This doesn't work when I use git fetch on the local repository. But if I do it like (old dos way) this it works:

export GIT_SSH="/c/Progra~1/TortoiseGit/bin/TortoisePlink.exe"

My question is:

How can I make it work using spaces in the variable?

For testing purpose you can simulate something like this (any example is good):

export VAR="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"
# and try to execute like this
$VAR

Is there a solution for this (other than the previous mentioned)?

Any links/hints are appreciated.

Thanks,

Iulian


回答1:


Execute it like this: "$VAR". This is one of the most significant gotchas in shell scripting because strings are always substituted literally and any contained spaces are treated as token delimiters rather than as characters of the string. Think of substituting a variable as a kind of code pasting at runtime.

What really happens when you write $VAR is that the shell tries to execute the binary /c/Program with a first argument Files/TortoiseGit/bin/TortoisePlink.exe.

I learned this the hard way by getting a strange syntax error in a big shell script for a particular input. No other languages I can think of can complain for syntax errors if the runtime input contains special characters - but that is the nature of shell scripting since command interpreters like bash and sh interpret the code line by line.

Whenever you expect a string to contain spaces and you don't want to treat it as separate tokens, enclose it in double quotes.




回答2:


For reference, I solved a similar issue on osx by encapsulating the argument with escaped quotations. This may not be the best solution, but it seems to work.

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



回答3:


I've solved it by including a backslash to escape the space:

/Program Files becomes /Program\ Files

Example:

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




回答4:


With Git 2.23 (Q3 2019, eight years later), a GIT_SSH set to /c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe will... work (for those still on Windows 7)!

See commit eb7c786 (16 Jul 2019) by Johannes Schindelin (dscho).
(Merged by Junio C Hamano -- gitster -- in commit a5194d8, 25 Jul 2019)

mingw: support spawning programs containing spaces in their names

On some older Windows versions (e.g. Windows 7), the CreateProcessW() function does not really support spaces in its first argument, lpApplicationName.
But it supports passing NULL as lpApplicationName, which makes it figure out the application from the (possibly quoted) first argument of lpCommandLine.

Let's use that trick (if we are certain that the first argument matches the executable's path) to support launching programs whose path contains spaces.

This fixes git-for-windows/git issue 692


Git 2.24 (Q4 2019) adds a test:

See commit 71f4960 (01 Oct 2019) by Alexandr Miloslavskiy (SyntevoAlex).
(Merged by Junio C Hamano -- gitster -- in commit 424663d, 09 Oct 2019)

t0061: fix test for argv[0] with spaces (MINGW only)

The test was originally designed for the case where user reported that setting GIT_SSH to a .bat file with spaces in path fails on Windows: git-for-windows#692



来源:https://stackoverflow.com/questions/5819423/bash-variables-with-spaces

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!