web-dev-qa-db-ja.com

「ls $ PWD」および「ls」。別のファイルを取得します。おそらく奇妙なキャッシュですか?

Linux Mintマシンで奇妙な問題が発生しました(問題があればソリッドステートドライブを使用)。どういうわけか、マシンは(複数回)異なるファイルを取得し、同じファイルに対して異なるコンテンツを取得します。または単に「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 ==>
5

これは、現在のディレクトリの名前が変更されたり、ディレクトリ内に移動したりした場合に発生する可能性があります。

例えば:

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

ディレクトリのiノード番号を見ると違いがわかります。

$ 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はシェルの場所ですthinksあなたがいる場所であり、必ずしも実際の場所ではありません:-)

15
Stephen Harris

これはキャッシュではありません。

UNIXライクなオペレーティングシステムでは、ファイルの名前、ファイル自体、およびその内容に違いがあることを理解する必要があります。たとえば、ファイルは/home/adam/myfileにあるかもしれませんが、これは基礎となるファイルシステムの「inode」にマップされます。ハードリンクは、同じiノードの別の名前です。 iノードは別の場所のデータにマップされるため、cat myfileでは、現在のディレクトリにmyfileに関連付けられているiノードを尋ね、そのiノード(通常はディスク上)を検索してから、iノードがマップするデータを探します。

これはディレクトリにも当てはまりますが、その内容はファイル名からiノードへのマップで構成されているため、通常のファイルとは異なります。

したがって、作業ディレクトリを/home/adam/cd2/adam_dev/rsimに変更すると、その名前の実際のディレクトリノードを見つけるためにルックアップが実行されます。しばらくすると、別のプロセスがディレクトリを別のパスに移動するか(UNIXでの移動は通常、名前の変更に似ています)、またはディレクトリが他の理由で親ディレクトリからリンク解除されている(つまり、親ディレクトリノードのファイルのリストから削除されている)可能性があります。 ;名前/home/adam/cd2/adam_dev/rsimは、同じディレクトリノードにマップされなくなったり、何にもマップされなくなったりする可能性があります。そのディレクトリノードはまだ存在し、おそらくファイルシステムの別の場所にあります。ls ..は、実際には、すべてのディレクトリがそれ自体を指すハードリンクのようなものです。 「現在のディレクトリ」を意味する単なる構文ではなく、ファイルシステム上の本物。

5
Dylan Frese