“ls $PWD”和“ls ”。获取不同的文件,也许奇怪的缓存?

“ls $PWD”和“ls ”。获取不同的文件,也许奇怪的缓存?

我的 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 ==>

答案1

如果您在当前目录中重命名或移动当前目录,则可能会发生这种情况。

例如:

$ 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
$ 

您可以通过查看目录的索引节点号来发现差异:

$ 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/

您还可以检测到这一点,因为/bin/pwd返回不同的值

$ /bin/pwd
/tmp/X/A
$ echo $PWD
/tmp/X/Y

基本上$PWD就是shell所在的地方你所在的地方,不一定是你真正所在的地方:-)

答案2

这不是缓存。

您必须了解,在类 UNIX 操作系统中,文件名、文件本身及其内容之间是有区别的。例如,一个文件可能位于/home/adam/myfile,但这映射到底层文件系统中的“inode”。硬链接是同一 inode 的不同名称。 inode 映射到其他地方的某些数据,因此cat myfile需要询问当前目录哪个 inode 与 myfile 关联,查找该 inode(通常在磁盘上),然后查找该 inode 映射到的数据。

对于目录来说也是如此,只不过它们的内容与常规文件不同,因为它们的内容由文件名到 inode 的映射组成。

因此,当您将工作目录更改为 时/home/adam/cd2/adam_dev/rsim,将进行查找以查找具有该名称的实际目录节点。经过一段时间后;也许另一个进程将目录移动到另一个路径(UNIX 中的移动通常更像是重命名),或者目录由于任何其他原因与父目录取消链接(即从父目录节点的文件列表中删除) ;该名称/home/adam/cd2/adam_dev/rsim可能不再映射到同一目录节点,或者可能不再映射到任何内容。该目录节点仍然存在,也许在文件系统的其他地方,这就是您运行时所看到的ls ..实际上就像每个目录都有指向自身的硬链接。这是文件系统上真实存在的东西,而不仅仅是语法意思是“当前目录”)。

答案3

您将命令放入ls -d $PWD/*bash 脚本中,它工作正常。

在 MacOS 上

touch /usr/local/bin/lll
chmod 755 /usr/local/bin/lll

code /usr/local/bin/lll
#!/bin/bash
ls -d $PWD/*

保存文件

然后打开一个新的终端窗口

使用命令lll并且工作正常。

相关内容