带空格的Bash变量
我在windows下的MinGW shell中面临下一个问题。我在我的带空格的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" 我的问题是: 如何使
/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\""