¿Cómo se crean los comandos del sistema como ls?

19

Tengo algunas dudas con respecto a * nix.

  • No sé qué tipo de archivo ejecutable es ls, si es .sh o .ksh o cualquier otro tipo de sistema ejecutable si lo es, ¿qué es eso?

  • cuando traté de ver cómo se ve el código fuente del lscomando, muestra algo ilegible, qué método usa * nix para crear este tipo de archivos ilegibles y puedo hacer que mis archivos sean similares a estos archivos (como ls- ilegible).

Jeyanthinath
fuente
44
Creo que está más relacionado con la URL anterior que con un dup.
slm

Respuestas:

31

Puede determinar la naturaleza de un ejecutable en Unix utilizando el filecomando y el typecomando.

tipo

Se usa typepara determinar la ubicación de un ejecutable en el disco de la siguiente manera:

$ type -a ls
ls is /usr/bin/ls
ls is /bin/ls

Así que ahora sé que lsse encuentra aquí en mi sistema en 2 ubicaciones: /usr/bin/ls& /bin/ls. Mirando esos ejecutables puedo ver que son idénticos:

$ ls -l /usr/bin/ls /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /usr/bin/ls

NOTA: Puede confirmar que son idénticos más allá de sus tamaños usando cmpo diff.

con diff
$ diff -s /usr/bin/ls /bin/ls
Files /usr/bin/ls and /bin/ls are identical
con cmp
$ cmp /usr/bin/ls /bin/ls
$ 

Usando archivo

Si los consulto con el filecomando:

$ file /usr/bin/ls /bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped
/bin/ls:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped

Por lo tanto, estos serían programas físicos reales que se han compilado de C / C ++. Si fueran scripts de shell, normalmente se presentarían así a file:

$ file somescript.bash 
somescript.bash: POSIX shell script, ASCII text executable

¿Qué es ELF?

ELF es un formato de archivo , es la salida de un compilador como gcc, que se utiliza para compilar programas C / C ++ como ls.

En informática, el formato ejecutable y enlazable (ELF, anteriormente llamado formato de enlace extensible) es un formato de archivo estándar común para ejecutables, código de objeto, bibliotecas compartidas y volcados de núcleo.

Normalmente tendrá una de las siguientes extensiones en el nombre de archivo: none, .o, .so, .elf, .prx, .puff, .bin

slm
fuente
@lgeorget: consulte estas preguntas y respuestas para obtener sugerencias sobre el uso del tipo frente a cuál: unix.stackexchange.com/questions/85249/… . En general, es mejor usartype cualquier lugar que esté tentado a usar whicho whereis.
slm
3
Además, para las herramientas GNU, el código fuente está disponible gratuitamente, comience su búsqueda en gnu.org/software
glenn jackman
Para la prueba idéntica, realmente debería usar algo como md5sumo sha1sum, no solo verificar el tamaño y la hora del archivo.
Bob
@Bob: esos archivos que son idénticos no tienen nada que ver con la Q, así que mostré un método simple. Para comparar los archivos, habría utilizado una herramienta más adecuada, como cmp, que está diseñada para comparar archivos binarios. También mirar para ver qué paquete son provistos indicaría si están relacionados o no. Ambos son parte coreutils-8.21-13.fc19.x86_64y sé que son idénticos después de 20 años de lidiar con los lanzamientos de Red Hat.
slm
@Bob: consulte las actualizaciones para ver ejemplos de comparación de archivos.
slm
9

Es un ejecutable binario (compilado en código de máquina, como la mayoría del sistema). Los scripts de Shell son más como "pegar" para unir partes para crear soluciones de manera rápida y flexible a partir de cosas existentes. Ese es el poder de * nix.

Necesita el código fuente (c, a veces c ++, son los lenguajes más comunes en * nix), no solo el ejecutable compilado. Como es de código abierto, puede obtener el código para todo de los repositorios en línea (las utilidades principales generalmente provienen del proyecto gnu). Sin embargo, es un poco complicado si no sabes cómo usar git u otros sistemas de seguimiento de versiones.

Aquí está el archivo ls.c, si ayuda: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c

Orión
fuente
Ah, y para aclarar la pregunta de cómo crear aplicaciones binarias: elija entre innumerables lenguajes de programación (a excepción de un par que son interpretados o semiinterpretados, como python, java, javascript, ... que tradicionalmente no producen un ejecutable independiente archivo binario). Luego aprenda a usar ese lenguaje y cómo compilarlo.
orion