带空格的Bash变量

带空格的Bash变量,bash,variables,spaces,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" 我的问题是: 如何使

我在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"
我的问题是:

如何使用变量中的空格使其工作

出于测试目的,您可以模拟如下内容(任何示例都很好):


是否有解决方案(除前面提到的以外)?

按如下方式执行:
“$VAR”
。这是shell脚本中最重要的问题之一,因为字符串总是被逐字替换,任何包含的空格都被视为标记分隔符,而不是字符串的字符。可以考虑在运行时将变量替换为一种代码粘贴

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

我通过在一个用于特定输入的大型shell脚本中遇到一个奇怪的语法错误,艰难地学会了这一点。如果运行时输入包含特殊字符,我想不出任何其他语言会抱怨语法错误——但这就是shell脚本的本质,因为bash和sh等命令解释器逐行解释代码


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

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

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

我通过添加一个反斜杠来逃离空间,从而解决了这个问题:

/Program Files
变为
/Program\Files

示例:

export GIT\u SSH=/c/Program\Files/TortoiseGit/bin/TortoisePlink.exe
使用GIT 2.23(2019年第3季度,八年后),将
GIT\u SSH
设置为
/c/Program\Files/TortoiseGit/bin/TortoisePlink.exe将。。。工作(适用于仍在Windows 7上的用户)

参见作者(2019年7月16日)
(于2019年7月25日合并)

mingw
:支持生成名称中包含空格的程序 在一些较旧的Windows版本(例如Windows 7)上,
CreateProcessW()
函数在其第一个参数
lpApplicationName
中实际上不支持空格
但是它支持将
NULL
作为
lpApplicationName
传递,这使得它可以从
lpCommandLine
的第一个参数(可能引用)中找出应用程序

让我们使用这个技巧(如果我们确定第一个参数匹配 可执行文件的路径),以支持启动其路径包含 空间

这修复了


Git 2.24(2019年第4季度)增加了一项测试:

参见(2019年10月1日)作者。
(于2019年10月9日合并)

t0061
:修复带有空格的
argv[0]
的测试(仅限MINGW) 该测试最初设计用于以下情况:用户报告将
GIT_SSH
设置为路径中带有空格的
.bat
文件在Windows上失败:


当您尝试
/c/Program\Files/TortoiseGit/bin/TortoisePlink.exe
时会发生什么情况?也就是说,包含一个反斜杠以避开空格。正如下面建议的,它不是working@chrisaycock:我也被蒙蔽了,但这只是一种避免export命令参数中双引号的方法。之后,这个字符串被以同样的方式处理,空格仍然是空格:-)@Iulian:那么你除了更改另一个脚本之外别无选择。。。或者没有空格。Git最初是为类Unix操作系统设计的,带有空格的路径不符合它们的约定。如果Git调用它时没有引用,那么这是Git错误,应该报告。虽然技术上可行,但如果您解释您所做的,您可能会得到赞成票(而不是反对票)。有人在这方面苦苦挣扎,他不会理解你所付出的一切的意义。谢谢你,埃德,这就是我需要的答案。
alias sub="\"/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl\""