Como são criados os comandos do sistema como ls?

19

Eu tenho algumas dúvidas sobre * nix.

  • Não sei que tipo de arquivo executável é ls, se é .sh ou .ksh ou qualquer outro tipo de sistema executável, se for, o que é isso?

  • quando tentei ver como é o código-fonte do lscomando, ele mostra algo ilegível, que método o * nix usa para criar esses tipos de arquivos ilegíveis e posso tornar meus arquivos semelhantes a esses arquivos (como ls- ilegíveis).

Jeyanthinath
fonte
4
Eu acho que é mais relacionado ao URL acima do que é um dup.
Slm

Respostas:

31

Você pode determinar a natureza de um executável no Unix usando o filecomando e o typecomando

tipo

Você usa typepara determinar a localização de um executável no disco da seguinte maneira:

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

Então agora eu sei que lsestá localizado aqui no meu sistema em 2 locais: /usr/bin/ls& /bin/ls. Olhando para esses executáveis, vejo que são 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: Você pode confirmar que eles são idênticos além dos tamanhos usando cmpou diff.

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

Usando arquivo

Se eu consultá-los usando o 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

Portanto, esses seriam programas físicos reais que foram compilados a partir do C / C ++. Se fossem scripts de shell, eles normalmente apresentariam assim file:

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

O que é ELF?

ELF é um formato de arquivo , é a saída de um compilador como gcc, que é usado para compilar programas C / C ++ como ls.

Na computação, o Executable and Linkable Format (ELF, anteriormente chamado Extensible Linking Format) é um formato de arquivo padrão comum para executáveis, código de objeto, bibliotecas compartilhadas e dumps principais.

Normalmente, ele possui uma das seguintes extensões no nome do arquivo: none, .o, .so, .elf, .prx, .puff, .bin

slm
fonte
@lgeorget - Consulte estas perguntas e respostas para obter dicas sobre como usar o tipo vs. o qual: unix.stackexchange.com/questions/85249/… . Em geral, é melhor usar apenas typeem qualquer lugar que você está tentado a utilização whichou whereis.
Slm
3
Além disso, para ferramentas GNU, o código fonte está disponível livremente, começar sua busca pelo gnu.org/software
glenn jackman
Para o teste idêntico, você realmente deve usar algo como md5sumou sha1sumnão apenas verificar o tamanho e o tempo dos arquivos.
Bob
@ Bob - Esses arquivos sendo idênticos não tinham nada a ver com o Q, então eu mostrei um método simples. Para comparar os arquivos, eu teria usado uma ferramenta mais adequada, como cmp, que serve para comparar arquivos binários. Também ver qual pacote é fornecido indica se eles estão relacionados ou não. Ambos fazem parte coreutils-8.21-13.fc19.x86_64e eu sei que são idênticos desde 20 anos lidando com os lançamentos da Red Hat.
Slm
@Bob - veja atualizações para exemplos de comparação de arquivos.
Slm
9

É um executável binário (compilado no código da máquina, como a maioria do sistema). Os scripts de shell são mais como "cola" para unir partes e criar soluções de material existente de maneira rápida e flexível. Esse é o poder do * nix.

Você precisa do código fonte (c, às vezes c ++, são os idiomas mais comuns no * nix), não apenas do executável compilado. Como é de código aberto, você pode obter o código para tudo, desde repositórios online (os principais utilitários geralmente são do projeto gnu). No entanto, é um pouco complicado se você não sabe como usar o git ou outros sistemas de rastreamento de versão.

Aqui está o arquivo ls.c, se ajudar: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c

orion
fonte
Ah, e para esclarecer a questão de como criar aplicativos binários: escolha entre inúmeras linguagens de programação (exceto algumas interpretadas ou semi-interpretadas, como python, java, javascript, ... que tradicionalmente não produzem um executável independente arquivo binário). Em seguida, aprenda a usar esse idioma e como compilá-lo.
orion