Comment sont créées les commandes système comme ls?

19

J'ai des doutes concernant * nix.

  • Je ne sais pas quel type de fichier exécutable est ls, que ce soit .sh ou .ksh ou tout autre type d'exécutable système s'il l'est, qu'est-ce que c'est?

  • lorsque j'ai essayé de voir à quoi ressemble le code source de la lscommande, il montre quelque chose d'illisible, quelle méthode * nix utilise-t-il pour créer ces types de fichiers illisibles et puis-je rendre mes fichiers similaires à ces fichiers (comme ls- illisibles).

Jeyanthinath
la source
4
Je pense que c'est plus lié à l'URL ci-dessus que c'est un dup.
slm

Réponses:

31

Vous pouvez déterminer la nature d'un exécutable sous Unix à l'aide de la filecommande et de la typecommande.

type

Vous utilisez typepour déterminer l'emplacement d'un exécutable sur le disque comme suit:

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

Je sais donc maintenant qu'il lsse trouve ici sur mon système à 2 endroits: /usr/bin/ls& /bin/ls. En regardant ces exécutables, je peux voir qu'ils sont identiques:

$ 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

REMARQUE: vous pouvez confirmer qu'ils sont identiques au-delà de leurs tailles en utilisant cmpou diff.

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

Utilisation d'un fichier

Si je les interroge à l'aide de la filecommande:

$ 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

Il s'agit donc de programmes physiques réels qui ont été compilés à partir de C / C ++. S'il s'agissait de scripts shell, ils se présenteraient généralement comme suit pour file:

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

Qu'est-ce que ELF?

ELF est un format de fichier , c'est la sortie d'un compilateur tel que gcc, qui est utilisé pour compiler des programmes C / C ++ tels que ls.

En informatique, le format exécutable et linkable (ELF, anciennement appelé Extensible Linking Format) est un format de fichier standard commun pour les exécutables, le code objet, les bibliothèques partagées et les vidages de mémoire.

Il aura généralement l'une des extensions suivantes dans le nom de fichier: aucune, .o, .so, .elf, .prx, .puff, .bin

slm
la source
@lgeorget - Voir cette Q&R pour obtenir des conseils sur l'utilisation du type par rapport à lequel: unix.stackexchange.com/questions/85249/… . Il est généralement préférable d'utiliser simplement typen'importe où vous êtes tenté d'utiliser whichou whereis.
slm
3
De plus, pour les outils GNU, le code source est disponible gratuitement, lancez votre recherche sur gnu.org/software
glenn jackman
Pour un test identique, vous devriez vraiment utiliser quelque chose comme md5sumou sha1sum, pas seulement vérifier la taille et la durée des fichiers.
Bob
@Bob - Ces fichiers étant identiques n'avaient rien à voir avec le Q donc j'ai montré une méthode simple. Pour comparer les fichiers, j'aurais utilisé un outil plus approprié tel que cmp qui est destiné à comparer des fichiers binaires. En regardant également pour voir quel package ils sont fournis, cela indiquerait s'ils sont liés ou non. Ils font tous deux partie de coreutils-8.21-13.fc19.x86_64et je sais juste qu'ils sont identiques après 20 ans de gestion des versions de Red Hat.
slm
@Bob - voir les mises à jour pour des exemples de comparaison de fichiers.
slm
9

Il s'agit d'un exécutable binaire (compilé en code machine, comme la plupart du système). Les scripts shell ressemblent plus à de la «colle» pour assembler des pièces afin de créer rapidement et de manière flexible des solutions à partir de choses existantes. C'est la puissance de * nix.

Vous avez besoin du code source (c, parfois c ++, sont les langages les plus courants sur * nix), pas seulement l'exécutable compilé. Comme il est open source, vous pouvez obtenir le code de tout à partir de référentiels en ligne (les principaux utilitaires proviennent généralement du projet gnu). Cependant, c'est un peu délicat si vous ne savez pas comment utiliser git ou d'autres systèmes de suivi de version.

Voici le fichier ls.c, si cela peut vous aider: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c

orion
la source
Oh et pour clarifier la question de savoir comment créer des applications binaires: choisissez parmi d'innombrables langages de programmation (à l'exception d'un couple qui sont interprétés ou semi-interprétés, tels que python, java, javascript, ... qui ne produisent pas traditionnellement un exécutable autonome fichier binaire). Apprenez ensuite à utiliser ce langage et à le compiler.
orion