使用空格的Bash变量

时间:2011-04-28 13:31:25

标签: bash variables spaces

我正面临着Windows下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

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

赞赏任何链接/提示。

谢谢,

尤利安

4 个答案:

答案 0 :(得分:48)

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

$VAR时真正发生的事情是shell尝试使用第一个参数/c/Program执行二进制Files/TortoiseGit/bin/TortoisePlink.exe

我通过在特定输入的大shell脚本中获取奇怪的语法错误来了解这一点。如果运行时输入包含特殊字符,那么我能想到的其他任何语言都不会抱怨语法错误 - 但这就是shell脚本的本质,因为像bash和sh这样的命令解释器会逐行解释代码。

每当您希望字符串包含空格并且您不希望将其视为单独的标记时,请将其用双引号括起来。

答案 1 :(得分:8)

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

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

答案 2 :(得分:2)

我通过加入反斜杠来解决这个问题:

/Program Files变为/Program\ Files

示例:

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

答案 3 :(得分:0)

使用Git 2.23(八年后的2019年第三季度),将GIT_SSH设置为/c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe即可(对于仍在寡妇7上的人)!

请参见commit eb7c786Johannes Schindelin (dscho)(2019年7月16日)。
(由Junio C Hamano -- gitster --commit a5194d8中合并,2019年7月25日)

  

mingw:支持生成名称中包含空格的程序

     

在某些较旧的Windows版本(例如Windows 7)上,CreateProcessW()函数实际上并未在其第一个参数lpApplicationName中支持空格。
  但是它支持将NULL作为lpApplicationName传递,这使得它可以从lpCommandLine的第一个参数(可能带引号)中找出应用程序。

     

让我们使用该技巧(如果我们确定第一个参数匹配   可执行文件的路径)以支持其路径包含以下内容的启动程序   空格。

     

此修复了git-for-windows/git issue 692