ls
/ ls -a
... acabou de ler o conteúdo do diretório atual, ele não faz nada com os arquivos.
ls -l
ou ls -F
ou ls --color
precisam obter informações de metadados dos próprios arquivos listados (permissão, tipo, propriedade, tempo de modificação ...). Portanto, além da chamada do sistema getdents()
para ler o conteúdo do diretório, ele precisa fazer um lstat()
para cada arquivo listado lá, e também um readlink()
para links simbólicos (e um stat()
também para links simbólicos com algumas implementações ls
com -F
ou --color
).
Para os +
ou @
e outros sinalizadores de método de acesso alternativo opcionais encontrados algumas vezes após as permissões, talvez seja necessário fazer algumas chamadas de sistema extras (como getxattr()
no Linux para recuperar ACLs).
Com ls -l
, também é necessário consultar o banco de dados do usuário para converter uid e gid em nome de usuário e nome de grupo.
Assim, enquanto para um simples ls
, só precisamos abrir um arquivo (o diretório de trabalho atual) e ler seu conteúdo, é fácil ver que há muito mais escopo para as coisas que falham com -l
/ -F
/ --color
...:
- o
lstat()
pode falhar ou ser interrompido se o arquivo for um ponto de montagem em um sistema de arquivos indisponível. - o
stat()
em um symlink pode falhar se o destino do symlink estiver em um fs indisponível. - a consulta ao banco de dados do usuário pode falhar ou travar (como em implantações usando bancos de dados de usuários de rede (LDAP / NIS +).