No Unix, fale qual é a diferença entre um shell script e um executável?

9

Eu vi esta pergunta neste site e isso me levou a faça esta pergunta. Eu quero saber no Unix falar qual é a diferença entre um executável e um shell script?

    
por Geek 10.12.2012 / 09:11

3 respostas

11

Um executável refere-se a qualquer arquivo com o conjunto de bits executável que pode ser executado (mesmo se houver erros na execução real do programa).

Um shell script é um tipo específico do executável que deve ser interpretado por um shell usando a diretiva #! para especificar um interpretador.

    
por 10.12.2012 / 09:25
12

Um script é um arquivo que:

  • é legível por humanos (pelo menos para um humano razoavelmente treinado, ou seja, o arquivo consiste em caracteres imprimíveis); e
  • é entendido por um interpretador como instruções que descrevem o comportamento de um programa.

Um script de shell é um script cujo interpretador é um shell . No mundo unix, “shell” refere-se à família de shells que se assemelham ao Bourne shell ; Esses shells modernos (ash, bash, ksh, zsh,…) estão de acordo com o padrão de shell POSIX . Mais geralmente, a palavra “shell” pode incluir outros interpretadores de comandos, como csh, tcsh, fish,…

Um executável é qualquer arquivo que possa ser executado. Para ser efetivamente executável, um arquivo precisa ter duas propriedades:

  • O usuário deve ter permissão para executá-lo. Isso pode ser visto com o comando ls -l : o caractere x deve estar presente na coluna de permissão.
  • O formato do arquivo deve ser aquele que o sistema reconheça como executável. Os formatos executáveis podem ser divididos em várias categorias:

    • Executáveis nativos, que consistem em código de máquina organizado de acordo com o layout do executável binário do sistema operacional. A maioria dos sistemas unix modernos usa o formato ELF para seus executáveis nativos.
    • Scripts. Um script executável é um arquivo que começa com uma linha shebang , consistindo dos dois caracteres #! seguidos por um caminho para um arquivo. Para executar tal arquivo, o kernel executa o programa do interpretador e passa o caminho para o script como um argumento.
    • Possivelmente outros formatos, dependendo do sistema. Por exemplo, o Linux pode registrar formatos de arquivos arbitrários por meio do recurso binfmt_misc . Isso permite que os arquivos de bytecode do Java sejam executados por meio de uma JVM , executáveis do Windows a serem executados através de Wine , etc.

Observe que ser um executável depende do sistema. Por exemplo, um binário amd64 Linux é executável em um sistema Linux amd64, mas não em um sistema de 32 bits. Um binário para o Android não é executável em uma instalação normal do Linux. Um executável do Windows só é executável no Linux se o Wine estiver presente. Um script que começa com #!/usr/local/bin/ruby é somente executável se houver um programa localizado em /usr/local/bin/ruby .

Um script de shell geralmente é executável. Mas pode ser não executável, se você não tiver permissão para executá-lo. Você ainda pode interpretá-lo passando-o explicitamente ao intérprete (por exemplo, bash /path/to/script ) - “interpretá-lo” é uma maneira sofisticada de dizer “executar”.

    
por 11.12.2012 / 01:54
2

script de shell:

Um script de shell é uma série de comandos que serão interpretados por um shell (geralmente sh ou um shell compatível com sh, às vezes outro).

O nome do script pode, mas NÃO precisa, terminar em ".sh" ou ".bash" ou ".csh" etc (dando uma dica quanto ao shell que deve ser lançado por).

Para maior clareza, assumirei: que o nome do script é script e o shell em que ele deve ser lançado é bash .

Uma maneira típica de iniciá-lo no shell seria: bash /absolute/path/to/the/script ou bash ./relative/path/to/the/script . Dessa forma, não é necessário ter o bit executável definido, pois ele é lido apenas pelo bash, que então executa o conteúdo.

também pode ser definido como + x (executável) para permitir iniciá-lo diretamente de sua sessão atual com: / absolute / path / to / the / script (ou ./relative/path / para / o / script). Cuidado: por padrão, quando lançado dessa forma, ele é lançado através do shell que você digitou ou através de um shell posix (o comportamento depende do sistema operacional), então ele pode não ser o shell que deveria ser executado por. É por isso que você pode (e deve) especificar como a primeira linha do script:     #! / path / to / good / shell que indica ao seu sistema operacional que esse script deve ser lançado por / path / to / good / shell.

executável:

Um executável é um arquivo que possui o bit "x" definido para o (s) usuário (s) / grupo (s) para o qual deve ser lançado. Pode ser tipicamente um "binário" ou um script.

Dica: file /some/file pode informar mais sobre o conteúdo do arquivo. Experimente file /usr/bin/bash ou file /etc/profile para ver alguns exemplos.

    
por 10.12.2012 / 12:50