¿Cómo leo el código fuente de los comandos de shell?


158

Me gustaría leer el código fuente real con el que se escriben los comandos de Linux. He adquirido cierta experiencia en su uso y ahora creo que es hora de interactuar con mi máquina a un nivel más profundo.

He encontrado algunos comandos aquí http://directory.fsf.org/wiki/GNU . Lamentablemente, no pude encontrar comandos básicos como 'ls', que me parece bastante fácil de comenzar.

¿Cómo leo exactamente el código fuente de los comandos de shell simples como 'ls'? Estoy corriendo en Ubuntu 12.04


1
Visite, por ejemplo: ftp.gnu.org/pub/gnu/coreutils . Puede navegar por el código en línea. Abra uno de los archivos y busque la carpeta src.
Haile

Hola, también encuentro utilidades, es util-linux. Puede encontrarlo aquí
acgtyrant

1
lsno es parte de Linux, es parte de Gnu. Gnu se ejecuta en Linux y otros núcleos.
ctrl-alt-delor

3
Encuentro la interfaz de github más fácil para leer el código, github.com/coreutils/coreutils/blob/master/src/ls.c
zyxue

Respuestas:


168

Todos estos comandos básicos son parte del coreutilspaquete.

Puede encontrar toda la información que necesita aquí:

http://www.gnu.org/software/coreutils/

Si desea descargar la última fuente, debe usar git:

git clone git://git.sv.gnu.org/coreutils

Para instalar git en su máquina Ubuntu, debe usar apt-get (git no está incluido en la instalación estándar de Ubuntu):

sudo apt-get install git

A decir verdad, aquí puede encontrar una fuente específica para el lscomando:

http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c

Solo 4984 líneas de código para un comando 'bastante fácil' como ls... ¿todavía está interesado en leerlo? ¡Buena suerte! :RE


2
¡DIOS MIO! Pensé que era un poco más fácil ... Bueno, el camino es más largo y más difícil de lo esperado :-)
Luigi Tiburzi

21
Prueba la fuente decat . Son solo 767 líneas.
Drew Noakes el

3
Only 4984 code lines ...- Parece que en 4 años y 3 meses se lsha convertido en otras 57 líneas más complejas.
sherrellbc

3
Recuerdo una vez que intenté entender por qué wces mucho más rápido que un programa Java equivalente. Así que miré el código ... OMG está optimizado para lecturas de disco, entradas de almacenamiento en búfer, etc. o qué :)
yǝsʞǝla

@ yǝsʞǝlA No soy competente en C; ¿Cómo sabes para qué está optimizando? ¿Puedes darme un ejemplo?
Abdul

127

Enlaces directos a la fuente de algunos programas populares en coreutils:

  • cat (767 líneas)
  • chmod (570 líneas)
  • cp (2912 líneas)
  • cut (831 líneas)
  • date (570 líneas)
  • df (1718 líneas)
  • du (1112 líneas)
  • echo (272 líneas)
  • head (1070 líneas)
  • hostname (116 líneas)
  • kill (312 líneas)
  • ln (651 líneas)
  • ls (4954 líneas)
  • md5sum (878 líneas)
  • mkdir (306 líneas)
  • mv (512 líneas)
  • nice (220 líneas)
  • pwd (394 líneas)
  • rm (356 líneas)
  • rmdir (252 líneas)
  • shred (1325 líneas)
  • tail (2301 líneas)
  • tee (220 líneas)
  • touch (437 líneas)
  • wc (801 líneas)
  • whoami (91 líneas)

Lista completa aquí.


44
Gracias por enumerar con número de líneas. :)
Gowtham Gopalakrishnan

¿Tiene usted su?
Aaron Esau

@Drew, ¿tienes alguna idea de si hay comandos de shell realmente escritos en script de shell?
Rafael


5

En realidad, http://suckless.org proporciona fuentes más sanas en su sbaserepositorio:

git clone git://git.suckless.org/sbase

Son más claros, más inteligentes, más simples y desagradables, por ejemplo, ls.csolo tiene 369 LOC

Después de eso, será más fácil entender el código GNU más complicado.


1

CoreUtils mencionado en otras publicaciones NO muestra la implementación real de la mayoría de las funciones que creo que busca. En la mayoría de los casos, proporciona interfaces para las funciones reales que recuperan los datos, que se pueden encontrar aquí:

Está construido sobre Gnulib con el código fuente real en el subdirectorio lib


1

Puedes tenerlo en github usando el comando

git clone https://github.com/coreutils/coreutils.git

Puede encontrar todos los códigos fuente en la carpeta src.

Necesitas tener instalado git .

Las cosas han cambiado desde 2012, el lscódigo fuente ahora tiene 5309 líneas


-1
    cd ~ && apt-get source coreutils && ls -d coreutils*     

Debería poder usar un comando como este en ubuntu para recopilar la fuente de un paquete, puede omitir sudosu descarga en la ubicación que posee.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.