cp /tmp/a ./
和之间有什么区别cp /tmp/a .
(即,目的地中有和没有尾随斜杠)?
它们都意味着复制/tmp/a
到当前目录,但我看到有些人坚持使用.
(不带尾随斜杠),我不明白其中的区别。
这两条命令是否 100% 相同?
cp /tmp/a ./
和之间有什么区别cp /tmp/a .
(即,目的地中有和没有尾随斜杠)?
它们都意味着复制/tmp/a
到当前目录,但我看到有些人坚持使用.
(不带尾随斜杠),我不明白其中的区别。
这两条命令是否 100% 相同?
在特定情况下,它们是相同的。在一般意义上,它们不一定相同。让我们给它们贴上标签:
cp /tmp/a ./
cp /tmp/a .
我们还引入两个类似的案例:
cp /tmp/a x/
cp /tmp/a x
首先,请注意,这个答案不能适用于所有命令。它适用于
cp
许多核心命令,但您不一定能将它应用于所有地方。例如rsync -a foo bar
和rsync -a foo/ bar
执行不同的操作(尽管bar
和bar/
操作相同)。大多数命令并不关心太多,但有些命令确实有特殊行为,其中尾随/
表示目录。现在来解释一下。
在所有系统上,(1) 和 (2) 都是相同的,因为
.
只能是目录。它们告诉系统将非目录复制/tmp/a
到当前目录,覆盖任何现有的非目录a
。选项 (3) 明确告诉系统将非目录项复制
/tmp/a
到当前目录中的目录,覆盖中已存在的x
任何现有的非目录项。a
x
但是,对于选项 (4),存在潜在的歧义,即
x
可能是目录也可能不是目录(实际上,可能甚至不存在)。如果x
是目录,则选项 (3) 适用。否则,指令是将非目录复制/tmp/a
到当前目录,创建x
或覆盖任何现有的非目录x
- 与选项 (1) 和 (2) 非常相似。结论
因为选项 (3) 及其结尾
/
的目的很明确(如果指定的目标不是目录,则会触发错误),所以有些人更喜欢为任何目录目标提供结尾的目录斜杠,即使没有其他含义。因此,即使只能是目录,他们也会./
为了一致性而书写。.
笔记
在所有情况下,如果源(
/tmp/a
)是目录,则cp
命令将失败并出现错误,例如cp: -r not specified; omitting directory '/tmp/a'
。