使用空格的Bash变量

INS*_*INS 30 variables bash spaces

我正面临着Windows下MinGW shell的下一个问题.我有/etc/profile下一个表达式:

export GIT_SSH="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"
Run Code Online (Sandbox Code Playgroud)

当我在本地存储库上使用git fetch时,这不起作用.但是,如果我这样做(旧的dos方式),它的工作原理:

export GIT_SSH="/c/Progra~1/TortoiseGit/bin/TortoisePlink.exe"
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

出于测试目的,您可以模拟这样的事情(任何示例都是好的):

export VAR="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"
# and try to execute like this
$VAR
Run Code Online (Sandbox Code Playgroud)

有没有解决方案(除了前面提到的)?

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

谢谢,

尤利安

Bla*_*iev 52

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

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

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

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

  • 如果git没有引用就调用它,那么它就是GIT bug,应该报告. (5认同)

小智 9

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

alias sub="\"/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl\""
Run Code Online (Sandbox Code Playgroud)


Edu*_*yer 9

我通过包含一个反斜杠来逃避空间来解决它:

/Program Files 变成 /Program\ Files

例子:

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