我在 Windows 系统上,使用cmd
shell 并运行 Git for Windows 附带的出色的 Linux 风格命令行工具,例如grep
和diff
。这些工具要求文件和目录参数使用 Linux 路径语法,而根本不理解 Windows 路径语法。
在 Windows 中cmd
,每个驱动器号都有自己的当前目录。在此示例中,我们假设驱动器 C 上的当前目录是C:\foo
,驱动器 D 上的当前目录是D:\bar
。假设我的当前驱动器是 C:
C:\foo>_
现在假设我想针对当前驱动器以外的驱动器的当前目录。
使用能够理解 Windows 语法的命令行程序,例如find
,我可以说:
C:\foo>find "something" d:somefile
并且缺少反斜杠表示这somefile
是相对于驱动器 D 上的当前目录,即D:\bar\somefile
。
如何使用需要 Linux 语法的工具(例如,grep
在 Windows 版 Git 下)执行此操作?我知道如何指定绝对路径:
C:\foo>grep <something> /d/bar/somefile
但假设我(或我的批处理文件)不知道绝对路径,或者它太长而我不想输入它。/d/bar/somefile
指定驱动器号D
但不指定目录的绝对路径的相对推论是什么bar
?
如果命令类似于diff
对两个不同驱动器各自的“当前目录”上的两个文件进行操作,则这尤其重要,因此“仅更改当前驱动器”并不能解决问题。
我很抱歉这个问题太长了,但我想确保这个场景得到了很好的解释。我无法使用 Google 或其他搜索引擎在任何地方找到这个。
答案1
Unix 路径语法不允许引用给定驱动器的当前目录,因为 Unix 没有驱动器的概念。所有路径都存在于一个从 开始的层次结构中,/
任何类型的所有磁盘都安装在这个层次结构的某个位置。在给定的操作系统上,这些路径的安装位置当然有约定俗成的规定,但 Unix 系统本质上并不要求它们位于任何特定位置。通常在 Unix 上,相同类型的数据始终位于不同机器上的文件系统中的相同位置,即使这些机器选择将这些数据存储在不同的物理驱动器组中。
Unix 系统确实有当前目录的概念,写法为.
(一个点),父目录则写法为..
(两个点)。请注意“the”的用法:每个进程只有一个当前目录,而不是每个驱动器一个。您可以引用相对于当前目录的文件,例如./foo/bar/baz
,或相对于父目录的文件,例如../../foo
。
如果问题是目录太长且不方便使用,您可以尝试使用符号链接,并且您会经常这样做,但在 Windows 上,这需要提升权限或开发人员模式。除此之外,如果您想引用另一个驱动器的当前目录,则必须指定绝对路径或相对路径。