git bash 中文件路径的正斜杠与反斜杠

Forward slash vs backward slash for file path in git bash

我是运行这两个命令在Gitbash.

为什么他们的行为不同?他们不应该做同样的事情还是我错过了什么?

git diff > D:\Patches\afterWGComment.txt  

D:/

中创建文件 PatchesafterWGComment.txt
git diff > D:/Patches/afterWGComment.txt  

D:/Patches/

中正确创建文件 afterWGComment.txt

请注意 D:/Patches/ 文件夹出现在 运行 上述命令之前。

那么 Linux 中的 Backslash (\) 通常表示 escape character。因此,在您的情况下,反斜杠正在转义字符串。尝试使用 cd "D:\Patches\afterWGComment.txt",您可以看到差异。

反斜杠是用于转义元字符的转义字符。这意味着你需要转义escape:

D:\Patches\afterWGComment.txt

或者您可以将字符串放在单引号中,这将使所有字符变为文字:

'D\Patches\afterWGComment.txt'

一些元字符:*~$!、...

Bash 将反斜杠视为转义字符,这意味着它后面的符号按字面解释,反斜杠本身被删除。

$ echo $HOME
/home/user
$ echo $HOME
$HOME

在Windows下,反斜杠用作路径分隔符,这会带来一些不便。幸运的是,单引号内的反斜杠字符失去了它的特殊含义,并按字面意义处理(与任何其他字符一样,单引号除外):

$ echo '$HOME'
$HOME

因此,如果您要将 Windows 路径复制并粘贴到 Git bash 中,请将其放在单引号内:

git diff > 'D:\Patches\afterWGComment.txt'

反斜杠在 Unix 中(因此在 Linux 中)有着很长的历史,意思是:引用下一个字符。

在shell(输入命令的地方)有3种引用方式:

  • 反引号 (\)
  • 单引号 (')
  • 双引号 (")

按照从强到软的顺序。例如,$是shell中的一个特殊字符,这样会打印一个变量的值:

$ a=Hello
$ echo $a
Hello

但这不会:

$ echo $a
$a

$ echo '$a'
$a

$ echo "$a"
Hello

在大多数情况下,反斜杠会使下一个字符成为 "not special",并且通常会转换为相同的字符:

$ echo \a
a

Windows 决定使用 \ 表示与字符 / 在 Unix 文件路径中的表示相同。
要在任何 Unix 中使用反斜杠编写路径,例如 shell,您需要引用它们:

$ echo \
\
$ echo '\'
\
$ echo "\"
\

对于您提供的示例,只需引用路径:

$ echo "Hello" > D:\Patches\afterWGComment.txt

这将创建包含单词 Hello 的文件 afterWGComment.txt

或:

$ echo "Hello" > 'D:\Patches\afterWGComment.txt'
$ echo "Hello" > "D:\Patches\afterWGComment.txt"
$ echo "Hello" > "D:/Patches/afterWGComment.txt"

引用并不简单,从1660年代开始就需要一长串的细节。