2011-04-28 108 views
18

我正在面对windows下的MinGW shell中的下一个问题。我在我的/etc/profile下一个表达式:带空格的变量变量

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

当我使用git在本地存储库中取出这不起作用。但是,如果我不喜欢它(老的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 

是否有一个解决方案(除了前面提到的)?

任何链接/提示表示赞赏。

感谢,

尤利安

+0

当您尝试'/ C会发生什么/ Program \ Files/TortoiseGit/bin/TortoisePlink.exe'?也就是说,包含一个反斜杠以逃避空间。如下所示 - – chrisaycock 2011-04-28 13:35:15

+0

- 它不起作用 – INS 2011-04-28 13:40:06

+0

@chrisaycock:我也被迷惑了,但这只是避免导出命令参数中的双引号的一种方式。之后,这个字符串以相同的方式处理,空格仍然是空格:-) – 2011-04-28 14:08:27

回答

37

执行这样的:"$VAR"。这是shell脚本中最重要的问题之一,因为字符串总是被字面替换,并且任何包含的空格都被视为令牌分隔符而不是字符串中的字符。考虑将变量替换为运行时粘贴的一种代码。

当您编写$VAR时会发生什么情况是,shell尝试使用第一个参数Files/TortoiseGit/bin/TortoisePlink.exe执行二进制/c/Program

我通过在特定输入的大型shell脚本中获取奇怪的语法错误,学会了这一难题。如果运行时输入包含特殊字符,我能想到的其他语言可能会抱怨语法错误 - 但这是shell脚本的本质,因为像bash和sh这样的命令解释程序会逐行解释代码。

无论何时您希望某个字符串包含空格并且您不想将其视为单独的标记,请将其用双引号引起来。

+0

@Iulian:那么你没有别的办法,只能改变另一个脚本......或者没有空格。 Git最初是为类Unix操作系统设计的,而具有空格的路径不符合其惯例。 – 2011-04-28 13:49:25

+5

如果git在不引用的情况下调用它,那么它就是GIT bug,应该报告。 – 2011-04-28 14:30:18

7

作为参考,我通过使用转义引用封装参数来解决了osx上的类似问题。这可能不是最好的解决方案,但它似乎工作。

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

我已经解决了它的最简单的方法:

出口GIT_SSH = 6/C /程序\文件/ TortoiseGit /斌/ TortoisePlink.exe

+1

虽然技术上可行,但如果你解释你做了什么,你可能会得到upvotes(而不是downvotes)。有人为此苦苦挣扎,无法理解你给出的意义。 – zaTricky 2017-11-20 08:28:28