在Git Bash中文件路径中正斜杠和反斜杠有什么区别?

8

我在 Git bash 中运行了这两个命令。

为什么它们的行为不同?它们不应该做相同的事情吗,还是我漏掉了什么?

git diff > D:\Patches\afterWGComment.txt  

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

D:/Patches/ 文件夹中,正确创建名为 afterWGComment.txt 的文件。

请注意,在运行上述命令之前,D:/Patches/ 文件夹已经存在。

4个回答

23

Bash将反斜杠视为转义字符,这意味着其后的符号会被直接解释,而反斜杠本身则会被忽略。

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

在Windows系统下,反斜杠被用作路径分隔符,这会带来一些不便。幸运的是,在单引号内,反斜杠字符失去其特殊含义,并且会被视为字面上的字符(像其他任何字符一样,除了单引号):

$ echo '\$HOME'
\$HOME

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

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

如果我使用双引号而不是单引号,这样安全吗?我通常认为它们是相同的。 - Saurav Sahu
4
不,反斜杠在双引号内仍然起转义字符的作用。 - Leon
“有些不便”是轻描淡写了。你无法展开带引号的路径等。 - Fizz

4

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

D:\\Patches\\afterWGComment.txt

您可以选择将字符串放在单引号中,这将使所有字符都成为字面量:

'D\Patches\afterWGComment.txt'

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

2

在Linux中,反斜杠 (\)通常表示转义字符。所以在您的情况下,反斜杠用于转义字符串。尝试使用cd "D:\Patches\afterWGComment.txt"命令,您会看到差异。


1

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

在shell(您键入命令的地方)中有三种引用方式:

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

从强到弱的顺序。例如,在shell中,$是一个特殊字符,这将打印变量的值:

$ a=Hello
$ echo $a
Hello

但这个不会:
$ echo \$a
$a

$ echo '$a'
$a

$ echo "$a"
Hello

在大多数情况下,反斜杠将使下一个字符“非特殊”,并且通常会转换为相同的字符:
$ echo \a
a

Windows决定使用 \ 作为Unix文件路径中字符 / 的等效表示。
在任何类Unix的Shell中,如果需要使用反斜杠写路径,需要对其进行引用。

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

对于你提出的例子,只需引用路径:

For the example you present, just quote the path:

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

这将创建名为 afterWGComment.txt 的文件,其中包含单词 Hello

或者:

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

引用并不简单,自 1660 年以来,它已经获得了许多细节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接