Tudo é um arquivo?

2

No Linux, cada entidade é considerada como FILE. Se eu fizer vim <cd-Name> , vim abrirá o conteúdo do diretório em seu editor, porque ele não diferencia entre arquivos e diretórios.

Mas hoje, enquanto trabalhava, encontrei uma coisa, que estou curiosa para saber.

Eu planejei abrir um arquivo do diretório aninhado

vim a/b/c/d/file

Mas em vez de vim , digitei

 cd a/b/c/d/

e pressione a tecla TAB duas vezes, mas o comando mostrava apenas o diretório disponível do diretório "d", em vez de arquivos.

Não é a honra do comando cd " tudo é um arquivo "? Ou estou faltando alguma coisa?

    
por SHW 26.08.2015 / 08:00

3 respostas

22

A frase " Tudo é um arquivo " define a arquitetura do sistema operacional. Isso significa que tudo no sistema a partir de processos, arquivos, diretórios, sockets, pipes, ... é representado por um descritor de arquivos abstraído do camada de sistema de arquivos virtual no kernel. O arquivo virtual é uma interface fornecida pelo kernel. Daí a frase foi corrigida para dizer " Tudo é um descritor de arquivo ". O próprio Linus Torvalds corrigiu-o novamente com um pouco mais de precisão: " Tudo é um fluxo de bytes ".

No entanto, cada "arquivo" também tem um proprietário e permissões que você pode conhecer de arquivos e diretórios comuns. Portanto, ferramentas clássicas do Unix, como cat, ls, ps, ... podem consultar todos esses "arquivos" e não é necessário inventar outros mecanismos especiais, além das simples ferramentas antigas, que usam a chamada do sistema read() . Por exemplo, na família de sistemas operacionais da Microsoft, existem várias chamadas diferentes do sistema read() (ouvi aproximadamente 15) para qualquer tipo de arquivo e cada uma delas é um pouco diferente. Quando tudo é um arquivo, você não precisa disso.

Para sua pergunta : Claro que existem arquivos diferentes tipos . No linux existem 7 tipos de arquivo . O diretório é um deles. Mas os utilitários podem distingui-los uns dos outros. Por exemplo, a função completa do comando cd (quando você pressiona TAB ) lista apenas diretórios, porque a chamada do sistema stat() (consulte man 2 stat ) retorna uma estrutura com um campo chamado% código%. O padrão POSIX define o que esse campo pode conter:

       S_ISREG(m)  is it a regular file?
       S_ISDIR(m)  directory?
       S_ISCHR(m)  character device?
       S_ISBLK(m)  block device?
       S_ISFIFO(m) FIFO (named pipe)?
       S_ISLNK(m)  symbolic link? (Not in POSIX.1-1996.)
       S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

A função de conclusão do comando st_mode exibe apenas "arquivos" onde o sinalizador cd está definido.

    
por 26.08.2015 / 08:26
6

Seu shell é inteligente o suficiente para saber que cd não funcionará com parâmetros de arquivo. Então, quando você atinge tab , ele mostra apenas as coisas nesse diretório que funcionarão com cd .

    
por 26.08.2015 / 08:09
1
  1. cd é incorporado em bash . A TAB completion é controlada pelas opções do bash, você pode encontrar vários scripts de conclusão em /usr/share/bash-completion/bash_completion e /etc/bash_completion.d . O método de conclusão de cd é definido no primeiro. Como cd só funciona no diretório, é natural listar apenas o diretório disponível.

  2. Tudo é um arquivo no linux.

por 26.08.2015 / 08:35