2008-10-15 26 views
13

Me gustaría saber exactamente cómo funciona el comando "Is" en Linux y Unix.¿Cómo funciona el comando 'ls' en Linux/Unix?

Por lo que yo sé, l horquillas & ejecutar en el shell de linux/unix y luego obtiene la salida (del árbol de archivos actual, por ejemplo,/home/banco /). Necesito una explicación más detallada, ya que no estoy seguro de lo que sucede después de llamar al tenedor.

¿Podría alguien explicar la funcionalidad del comando 'ls' en detalle?

Respuesta

38

ls no tenedor. El shell se bifurca y ejecuta para ejecutar cualquier comando que no esté incorporado, y uno de los comandos que puede ejecutar es ls.

ls usa opendir() y readdir() para recorrer todos los archivos en el directorio. Si necesita más información sobre uno de ellos, llama a stat().

+1

Como punto de interés, creo que encontrará stat() en casi todos los archivos del directorio, especialmente si están activados los colores y/o tipo de archivo pre/sufijos. –

+0

En una nota diferente, ¿por qué el caparazón necesita tenedor para procesos en primer plano? –

+2

monóxido: un ejecutor() sin un fork() reemplazará el proceso que se está ejecutando actualmente, lo que significa que su caparazón se desvanecería la primera vez que ejecutara un comando. –

10

Para agregar a la respuesta, en el libro de Lenguaje de programación C (K & RC) han dado un pequeño ejemplo sobre cómo implementar ls. Han explicado muy bien las estructuras de datos y las funciones.

+1

Si alguien aquí viene buscando, la sección es '8.6' en el libro. – avi

4

Para entender lo que hace, puede echar un vistazo a la fuente de OpenSolaris: https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/cmd/ls/ls.c.

Si eso es abrumador, en Solaris comienza utilizando truss para ver las llamadas al sistema que hace para entender lo que hace. El uso de celosía, intente:

cercha -afl -o ls.out/bin/ls

luego ver el resultado en ls.out

Creo que traza es el equivalente a braguero en Linux.

+3

La versión de Linux de "truss" se llama "strace". – Thomas

3

Si realmente quiere entender las entrañas detalladas de ls, mire el código fuente. Puede seguir el enlace de tpgould a la fuente de Solaris, o es fácil encontrar la fuente en línea desde cualquier distribución de Linux o BSD.

Recomiendo especialmente la fuente 4.4BSD.

Como recuerdo, ls comienza analizando sus muchas opciones, luego comienza con los archivos o directorios listados en la línea de comando (el valor predeterminado es "."). Los subdirectorios se manejan por recursividad en la rutina de la lista de directorio. No hay fork() o exec() que recuerde.

+0

Completo novato C que se despertó una mañana preguntándose cómo funciona C. ¿Es este el archivo 4.4BSD en cuestión? (Obviamente pasará un tiempo antes de que esté en el punto de poder darle sentido, pero tengo que empezar en algún lado ...) https://github.com/sergev/4.4BSD-Lite2/blob/master/usr/ src/bin/ls/ls.c – henry

+0

@henry Ese es el archivo, aunque (o cualquier otro ls.c) es probablemente demasiado complejo para un "novato C completo" usándolo para su estudio. – mpez0

+0

Sí definitivamente no entenderé esto pronto, pero al menos sé cuál es el objetivo. ¡Gracias! – henry

0

Este es un hilo viejo, pero aún así estoy comentando porque creo que la respuesta que se votó arriba y se aceptó es parcialmente incorrecta. @Mark dice que ls está integrado en el shell para que el shell no se ejecute ni se bifurque. Cuando estudié el documento tldp en bash (adjunté el enlace) "ls" no figura como un comando de compilación.

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_01_03.html

comandos Bash incorporadas:

alias, se unen, orden interna, comando, declarar, eco, permite, ayudar, y mucho, local, cierre de sesión, printf, leer, shopt, tipo, tipografía , ulimit y unalias.

+3

Creo que está malinterpretando la respuesta original y está muy de acuerdo con ella. La pregunta decía "ls se bifurca y se ejecuta en el shell de linux/unix" a lo que la respuesta respondió correctamente "ls no se bifurca. El shell se bifurca y se ejecuta" y continuó diciendo que ls es uno de los comandos que utiliza el shell/ejecutivos – alanc

+1

@alanc Gracias por aclarar. Votando la respuesta aceptada :) – Raghupathy