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


Respostas:


12

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 script de shell é um tipo específico de executável que deve ser interpretado por um shell usando a #!diretiva para especificar um intérprete.


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 intérprete como instruções que descrevem o comportamento de um programa.

Um script de shell é um script cujo intérprete é um shell . No mundo unix, "concha" refere-se à família de conchas que se assemelham à concha Bourne ; conchas modernas (cinzas, bash, ksh, zsh,…) estão em conformidade com o padrão de shell POSIX . De maneira mais geral, a palavra "shell" pode incluir outros intérpretes de comando, 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 xcaractere deve estar presente na coluna de permissão.
  • O formato do arquivo deve ser aquele que o sistema reconhece como executável. 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 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 nos dois caracteres #!seguidos por um caminho para um arquivo. Para executar esse arquivo, o kernel executa o programa interpretador e passa o caminho para o script como argumento.
    • Possivelmente outros formatos, dependendo do sistema. Por exemplo, o Linux pode registrar formatos de arquivo arbitrários através do recurso binfmt_misc . Isso permite que os arquivos de bytecode Java sejam executados por meio de uma JVM registrada , os executáveis ​​do Windows sejam executados por meio do Wine , etc.

Observe que ser um executável depende do sistema. Por exemplo, um binário amd64 Linux é executável em um sistema amd64 Linux, mas não em um sistema de 32 bits. Um binário para 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/rubysó é 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 elegante de dizer "executar".


2

shell-script:

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 sobre o shell pelo qual ele deve ser iniciado).

Para maior clareza, assumirei: que o nome do script é scripte 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/scriptou bash ./relative/path/to/the/script. Dessa forma, ele não precisa ter o bit executável definido, pois ele é lido apenas pelo bash, que então executa o conteúdo.

Também pode ser definido + x (executável) para permitir iniciá-lo diretamente da sua sessão atual do shell com: / absolute / path / to / the / script (ou ./relative/path/to/the/script). Cuidado: por padrão, quando iniciado dessa maneira, é iniciado através do shell digitado ou através de um shell posix (o comportamento depende do SO), portanto, pode não ser o shell pelo qual deveria ser executado. É 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 realmente ser iniciado 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) pelo qual deve ser iniciado. Pode ser tipicamente um "binário" ou um script.

Dica: file /some/filepode informar mais sobre o conteúdo do arquivo. Experimente file /usr/bin/bashou file /etc/profileveja alguns exemplos.


Sua declaração sobre scripts executados por shebangless que estão sendo executados pelo seu shell atual está incorreta. O comportamento depende do sistema operacional. Geralmente, um shell POSIX ou seu shell de login são usados.
— Jlliagre

Obrigado por esta precisão. Vou editar minha resposta para adicionar seu comentário.
— Olivier Dulac
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.