En Linux, cada entidad individual se considera como ARCHIVO. Si hago vim <cd-Name>
entonces, vim
abrirá el contenido del directorio en su editor, porque no diferencia entre archivos y directorios.
Pero hoy, mientras trabajaba, me encontré con algo que tengo curiosidad por saber.
Planeé abrir un archivo desde un directorio anidado
vim a/b/c/d/file
Pero en lugar de vim
, escribí
cd a/b/c/d/
y presione el TAB dos veces, pero el comando solo mostraba el directorio disponible del directorio "d" en lugar de los archivos.
No el cd
comando honor “todo es un archivo “? ¿O me estoy perdiendo algo?
Respuesta aceptada:
El “Todo es un archivo ” frase define la arquitectura del sistema operativo. Significa que todo en el sistema, desde procesos, archivos, directorios, sockets, conductos, … está representado por un descriptor de archivo abstraído sobre la capa del sistema de archivos virtual en el núcleo. El sistema de archivos virtual es una interfaz proporcionada por el núcleo. Por lo tanto, la frase se corrigió para decir "Todo es un descriptor de archivo “. El propio Linus Torvalds volvió a corregirlo con un poco más de precisión:“Todo es un flujo de bytes “.
Sin embargo, cada "archivo" también tiene un propietario y permisos que puede conocer de los archivos y directorios normales. Por lo tanto, las herramientas clásicas de Unix como cat, ls, ps, ... pueden consultar todos esos "archivos" y no es necesario inventar otros mecanismos especiales, además de las herramientas antiguas, que usan read()
llamada del sistema. Por ejemplo, en la familia de sistemas operativos de Microsoft hay varios read()
diferentes llamadas al sistema (escuché unas 15) para cualquier tipo de archivo y cada una de ellas es un poco diferente. Cuando todo es un archivo, entonces no lo necesitas.
A su pregunta :Por supuesto que hay diferentes tipos de archivos . En Linux hay 7 tipos de archivos. El directorio es uno de ellos. Pero, las utilidades pueden distinguirlos entre sí. Por ejemplo, la función completa del cd
comando (cuando presiona TAB ) solo lista directorios, porque stat()
llamada al sistema (ver man 2 stat
) devuelve una estructura con un campo llamado st_mode
. El estándar POSIX define lo que ese campo puede contener:
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.)
El cd
la función de finalización de comando solo muestra "archivos" donde el S_ISDIR
la bandera está configurada.