“ls $ PWD” e “ls.” obtêm arquivos diferentes, talvez com cache estranho?

5

Eu tenho um problema estranho na minha máquina Linux Mint (com unidade de estado sólido, se isso importa). De alguma forma, a máquina (em várias ocasiões) obtém arquivos diferentes e conteúdo diferente para o mesmo arquivo, se eu fizer "ls $ PWD" em vez de "ls". ou apenas "ls". Isso significa que posso escrever o arquivo no diretório de trabalho atual e pegar algo diferente copiando-o de outro diretório.

Não é $ PWD definido para a coisa errada, eu posso digitar manualmente o nome do diretório.

Eu verifiquei isso com bastante cuidado, mas ele vem e vai. Isso dificulta a criação e o teste de scripts e códigos de produção.

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 ==>
    
por Adam N. Rosenberg 12.07.2016 / 23:17

2 respostas

15

Isso pode acontecer se o diretório atual for renomeado ou movido enquanto você estiver nele.

Por exemplo:

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

Você pode identificar a diferença em olhar o número de inode do diretório:

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

Você também pode detectar isso porque /bin/pwd retorna um valor diferente

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

Basicamente, $PWD é exatamente onde você está, e não necessariamente onde você realmente está: -)

    
por 12.07.2016 / 23:32
5

Isso não é cache.

Você precisa entender que, em sistemas operacionais semelhantes a UNIX, há uma distinção entre o nome de um arquivo, o próprio arquivo e seu conteúdo. Por exemplo, um arquivo pode ser encontrado em /home/adam/myfile , mas isso é mapeado para um 'inode' no sistema de arquivos subjacente. Um hardlink é um nome diferente para o mesmo inode. O inode mapeia para alguns dados em algum outro lugar, então cat myfile envolve perguntar ao diretório atual que inode está associado a myfile, procurando o inode (normalmente no disco) e procurando pelos dados que o inode mapeia.

Isto também é verdadeiro para diretórios, exceto que seus conteúdos são diferentes dos arquivos regulares, já que seu conteúdo consiste em mapas de nomes de arquivos para inodes.

Assim, quando você altera seu diretório de trabalho para /home/adam/cd2/adam_dev/rsim , uma pesquisa é feita para localizar o nó do diretório real com esse nome. Depois de algum tempo passa; talvez outro processo mova o diretório para outro caminho (uma mudança no UNIX geralmente é mais como uma renomeação), ou o diretório é para qualquer outro motivo desvinculado do diretório pai (ou seja, removido da lista de arquivos do nó do diretório pai) ; o nome /home/adam/cd2/adam_dev/rsim pode não ser mais mapeado para o mesmo nó de diretório ou pode não mais mapear para nada. Esse nó de diretório ainda existe, talvez em algum outro lugar no sistema de arquivos, e é isso que você está vendo quando você executa ls . ( . é como um hardlink que todo diretório tem que aponta para si mesmo. É uma coisa real no sistema de arquivos, não apenas a sintaxe para significar 'o diretório atual').

    
por 12.07.2016 / 23:44

Tags