Come vengono creati i comandi di sistema come ls?


19

Ho dei dubbi su * nix.

  • Non so che tipo di file eseguibile sia ls, che sia .sh o .ksh o qualsiasi altro tipo di eseguibile di sistema se lo è, che cos'è?

  • quando ho provato a vedere che lsaspetto ha il codice sorgente del comando, mostra qualcosa di illeggibile, quale metodo usa * nix per creare questi tipi di file illeggibili e posso rendere i miei file simili a questi file (come ls- illeggibili).



4
Penso che sia più correlato all'URL sopra che è un dup.
slm

Risposte:


31

Puoi determinare la natura di un eseguibile in Unix usando il filecomando e il typecomando.

genere

Si utilizza typeper determinare la posizione di un eseguibile sul disco in questo modo:

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

Quindi ora so che lssi trova qui sul mio sistema in 2 posizioni: /usr/bin/ls& /bin/ls. Guardando quei file eseguibili posso vedere che sono identici:

$ 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: è possibile confermare che sono identici oltre le dimensioni utilizzando 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
$ 

Utilizzando il file

Se li interrogo usando il 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

Quindi questi sarebbero veri e propri programmi fisici che sono stati compilati da C / C ++. Se fossero script di shell, in genere si presenterebbero in questo modo per file:

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

Cos'è ELF?

ELF è un formato di file , è l'output di un compilatore come gcc, che viene utilizzato per compilare programmi C / C ++ come ls.

Nell'informatica, il formato eseguibile e collegabile (ELF, precedentemente chiamato Extensible Linking Format) è un formato file standard comune per eseguibili, codice oggetto, librerie condivise e core dump.

In genere avrà una delle seguenti estensioni nel nome file: none, .o, .so, .elf, .prx, .puff, .bin


@lgeorget - Consulta le Domande e risposte per suggerimenti sull'uso del tipo rispetto al quale: unix.stackexchange.com/questions/85249/… . In genere è meglio usare semplicemente typeovunque tu sia tentato di usare whicho whereis.
slm

3
Inoltre, per gli strumenti GNU, il codice sorgente è disponibile gratuitamente, inizia la tua ricerca su gnu.org/software
glenn jackman

Per il test identico, dovresti davvero usare qualcosa di simile md5sumo sha1sum, non solo controllare le dimensioni e i tempi dei file.
Bob

@Bob - Quei file identici non avevano nulla a che fare con la Q, quindi ho mostrato un metodo semplice. Per confrontare i file avrei usato uno strumento più adatto come cmp che è pensato per confrontare i file binari. Anche cercare di vedere quale pacchetto sono forniti indicherebbe se sono correlati o meno. Fanno entrambi parte di coreutils-8.21-13.fc19.x86_64e so solo che sono identici da 20 anni di trattative con le versioni di Red Hat.
slm

@Bob: vedere gli aggiornamenti per esempi sul confronto dei file.
slm

9

È un eseguibile binario (compilato in codice macchina, come la maggior parte del sistema). Gli script Shell sono più simili alla "colla" per unire le parti per creare rapidamente e in modo flessibile soluzioni da elementi esistenti. Questo è il potere di * nix.

È necessario il codice sorgente (c, a volte c ++, sono le lingue più comuni su * nix), non solo l'eseguibile compilato. Essendo open source, puoi ottenere il codice per qualsiasi cosa dai repository online (le utility di base sono di solito dal progetto gnu). Tuttavia, è un po 'complicato se non sai come usare git o altri sistemi di tracciamento delle versioni.

Ecco il file ls.c, se aiuta: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c


Oh e per chiarire la domanda su come creare applicazioni binarie: scegli tra innumerevoli linguaggi di programmazione (ad eccezione di una coppia interpretata o semi-interpretata, come python, java, javascript, ... che tradizionalmente non produce un eseguibile autonomo file binario). Quindi impara ad usare quella lingua e come compilarla.
Orion,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.