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.

Chris Down
fonte
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".

Gilles 'SO- parar de ser mau'
fonte
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.

Olivier Dulac
fonte
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