我的 Linux Mint 机器上有一个奇怪的问题(如果有问题,请使用固态驱动器)。不知何故,如果我执行“ls $PWD”而不是“ls” ,机器(在多种情况下)会获得不同的文件和同一文件的不同内容。或只是“ls”。这意味着我可以将文件写入当前工作目录并从另一个目录中选取不同的内容复制它。
这不是 $PWD 设置错误,我可以手动输入目录名称。
我已经非常仔细地检查了这一点,但它确实来来去去。这使得制作和测试生产脚本和代码变得困难。
adam@RADIUM:/home/adam/cd2/adam_dev/rsim ==> ls .
ClearPrice.cme Makefile.win data gfiles rsim5.tmp src zlib
ClearPrice.src ReadMe.txt err include rsimdone.txt tools
Makefile build g2f out scripts vs2013
adam@RADIUM:/home/adam/cd2/adam_dev/rsim ==>
adam@RADIUM:/home/adam/cd2/adam_dev/rsim ==> echo $PWD
/home/adam/cd2/adam_dev/rsim
adam@RADIUM:/home/adam/cd2/adam_dev/rsim ==> ls $PWD
ClearPrice.cmd Makefile.win err include scripts vs2013
ClearPrice.src ReadMe.txt g2f out src zlib Makefile build
gfiles rsimdone.txt tools
adam@RADIUM:/home/adam/cd2/adam_dev/rsim ==>
Run Code Online (Sandbox Code Playgroud)
Ste*_*ris 15
如果当前目录在您在其中时被重命名或移动,就会发生这种情况。
例如:
$ mkdir /tmp/X
$ cd /tmp/X
$ mkdir Y Z
$ cd Y
$ touch a b c d e f
$ mv ../Y ../A
$ mv ../Z ../Y
$ echo $PWD
/tmp/X/Y
$ ls
a b c d e f
$ ls $PWD
$
Run Code Online (Sandbox Code Playgroud)
您可以通过查看目录的 inode 编号发现不同之处:
$ ls -ldi . $PWD
26871815 drwxr-xr-x 2 sweh sweh 4096 Jul 12 17:27 ./
26872035 drwxr-xr-x 2 sweh sweh 4096 Jul 12 17:27 /tmp/X/Y/
Run Code Online (Sandbox Code Playgroud)
您也可以检测到这一点,因为/bin/pwd返回不同的值
$ /bin/pwd
/tmp/X/A
$ echo $PWD
/tmp/X/Y
Run Code Online (Sandbox Code Playgroud)
基本上,$PWD就是 shell认为你在的地方,不一定是你真正在的地方:-)
小智 5
这不是缓存。
您必须了解,在类 UNIX 操作系统中,文件名、文件本身及其内容之间存在区别。例如,可能会在 找到一个文件/home/adam/myfile,但这会映射到底层文件系统中的“inode”。硬链接是同一个 inode 的不同名称。inode 映射到其他地方的某些数据,因此cat myfile涉及询问当前目录与 myfile 关联的 inode,查找该 inode(通常在磁盘上),然后查找 inode 映射到的数据。
对于目录也是如此,除了它们的内容与常规文件不同,因为它们的内容由文件名到 inode 的映射组成。
因此,当您将工作目录更改为 时/home/adam/cd2/adam_dev/rsim,将执行查找以找到具有该名称的实际目录节点。过了一段时间后;也许另一个进程将目录移动到另一个路径(在 UNIX 中移动通常更像是重命名),或者目录由于其他任何原因与父目录断开链接(即,从父目录节点的文件列表中删除) ; 该名称/home/adam/cd2/adam_dev/rsim可能不再映射到同一目录节点,或者可能不再映射到任何内容。那个目录节点仍然存在,也许在文件系统的其他地方,这就是你在运行时看到的ls .(.实际上就像一个硬链接,每个目录都有指向它自己的。它是文件系统上的真实事物,不仅仅是语法意思是“当前目录”)。
| 归档时间: |
|
| 查看次数: |
3592 次 |
| 最近记录: |