Por que "ls" gera esporadicamente apenas "." no diretório raiz de uma unidade externa?

9

No diretório raiz da minha unidade flash USB, às vezes quando corro ls, a saída é normal e lista os arquivos. Outras vezes, a saída é simplesmente uma linha:

$ ls
.

Se eu tentar ls -laem um desses momentos, recebo o seguinte:

$ ls -la
ls: .: Invalid argument

Se eu lsvoltar repetidamente várias vezes, parece retornar a saída normal ou a saída anormal basicamente aleatoriamente.

lsparece funcionar normalmente em outros diretórios. ls $drivenameaté parece funcionar bem no diretório pai e ls ..parece funcionar bem em um diretório filho. (Embora eu não tenha 100% de certeza daquelas que "funcionam normalmente", pois o comportamento é indeterminado para começar.) Tentei outras duas unidades USB externas e obtive o mesmo comportamento.

O que está acontecendo aqui? Estou no Mac OS X 10.11.3.

Edit: Boa idéia, mas eu não pareço estar usando um alias e /bin/lsdá o mesmo resultado.

leekaiinthesky
fonte
2
Esse comportamento incomum pode ser o resultado de um alias com defeito. O que acontece se você usar /bin/ls?
DopeGhoti 03/03
ls funciona bem em outros diretórios?
Liam
/bin/lsdá o mesmo resultado, às vezes produzindo .. lsparece funcionar normalmente em outros diretórios. ls NO\ NAMEaté parece funcionar bem no diretório pai e ls ..parece funcionar bem em um diretório filho. (Embora eu não pode ser 100% de certeza dos que "trabalhar normalmente" uma vez que o comportamento é indeterminado, para começar.)
leekaiinthesky
Qual sistema de arquivos você está usando nessas unidades flash? Talvez seja alguma anomalia derivado de um sistema de arquivos baseados no Windows
RSFalcon7
Qual versão lsvocê está usando? /bin/ls --versiondeve trabalhar
RSFalcon7

Respostas:

6

Pode ser um erro no driver do sistema de arquivos do FAT32 em versões recentes do OSX. Isso também parece ocorrer apenas quando o diretório de trabalho está na raiz da unidade montada. Se estiver em um subdiretório ou em qualquer outro lugar do sistema, as coisas parecem funcionar.

Há alguma discussão interessante neste segmento, incluindo rastreios do sistema. https://github.com/robbyrussell/oh-my-zsh/issues/4161

Neil
fonte
2

SOLUÇÃO: (provavelmente parte do que o solicitante apreciaria, mesmo que não o pedisse especificamente)

Consulte o diretório atual de qualquer outra maneira que não seja .. Exemplo:

cdpara um subdiretório e, em seguida, execute lsno diretório pai. Ou seja, insira algo como isto:

mkdir S; cd S ; /bin/ls -al ..

Ou consulte-o pelo nome completo do caminho. Exemplo:

ls /Volumes/microSD007

Para mim, qualquer uma dessas soluções alternativas funciona (ou seja, elas resultam na saída esperada) quando lsme dá a mesma saída errada que o OP relatou. (E para mim, não há saída no dmesg quando lsage de maneira estranha.)

Estou vendo as mesmas falhas no 10.12.6 no Terminal.app executando o bash. Mesmo em cshe sh, mesmo depois de definir TERM como vt100. Essa solução alternativa também funciona nessas conchas.

E eu concordo que há um erro stat64, conforme indicado no zshtópico da questão que Neil nos aponta. (Eu achava que o problema era causado por falhas na memória flash e / ou falsa, e ainda me pergunto se isso é um fator algumas vezes.)

Notei que esse bug também afeta:

  • Modo direcionado do Emacs, porque ele chama lse
  • ls quando usado no modo shell do Emacs.
Matthew Elvey
fonte
2
Não entendo por que o Goro fez as edições que fizeram e nenhum resumo de edição foi fornecido. Acho que eles pioraram a resposta e agora vejo que recebeu um -1. Forneci uma solução alternativa, removendo meu indicador de 'solução alternativa' parece que estou reivindicando / tentando fornecer uma resposta direta. Acho que estou oferecendo mais que um comentário, mas menos que uma resposta. Isso não deve ser encorajado? Eu identifiquei um novo; não seria apropriado um resumo de edição e uma razão para o -1? Goro também removeu uma resposta melhor e mais curta que eu adicionara. Eu não entendo.
Matthew Elvey
1
Estou em cima do muro; geralmente as respostas precisam responder à pergunta, não apenas fornecer mais informações, mas contornar o problema provavelmente faz parte do que o solicitante estava procurando, mesmo que não o tenha mencionado especificamente. A maioria das edições parece meio desnecessária, e pelo menos uma definitivamente atrapalha a formatação, então eu as revirei. Eu não tenho certeza se o post já teve um downvote, mas é atualmente em 2 upvotes e 0 downvotes
Michael Mrozek
0

Se você às vezes remover a unidade, a resposta é que cada vez que reinserir a unidade, você deverá retornar ao diretório usando o cd. Isso ocorre porque o descritor de arquivo aberto pelo seu shell para ler o diretório é invalidado quando a unidade é removida e não é reinicializado automaticamente quando a unidade é reinserida (mesmo que você tenha usado a unidade em outro terminal ou gerenciador de arquivos).

Se a unidade nunca for removida, pode ser um problema de hardware ou talvez algum software que desmonte a unidade por algum motivo; você deve fornecer os logs do sistema.

Lei29
fonte