O que a linha "#! / Bin / sh" significa em um script de shell UNIX?

142

Eu estava passando por alguns tutoriais de scripts de shell e encontrei o seguinte programa de exemplo:

#!/bin/sh
clear
echo "HELLO WORLD"

Alguém pode me dizer qual é o significado do comentário #!/bin/shno início?

Jake
fonte
2
Shebang
drootang 9/09/09
2
Boa explicação no askubuntu: askubuntu.com/questions/141928/…
fkoessler 28/11/13

Respostas:

143

É chamado de shebang e informa ao shell pai qual intérprete deve ser usado para executar o script.

por exemplo

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

É implementado como um comentário para que qualquer coisa que chegue nessa linha não seja "relevante" para o intérprete especificado. por exemplo, todas as linguagens de script tendem a entender que uma linha que começa com #é um comentário e ignorará a !/usr/bin/whateverparte, que de outra forma poderia ser um erro de sintaxe nessa linguagem específica.

Marc B
fonte
6
Geralmente é o kernel, não o shell, que processa isso. O shell simplesmente chama a chamada do exec()sistema no arquivo.
tripleee
47

Quando você tenta executar um programa em unix (um com o conjunto de bits executável), o sistema operacional examinará os primeiros bytes do arquivo. Estes formam o chamado "número mágico", que pode ser usado para decidir o formato do programa e como executá-lo.

#!corresponde ao número mágico 0x2321 (procure-o em uma tabela ascii). Quando o sistema vê esse número mágico, sabe que está lidando com um script de texto e lê até o próximo \n(há um limite, mas ele me escapa). Depois de identificar o intérprete (o primeiro argumento após o shebang), ele chamará o intérprete.

Outros arquivos também têm números mágicos. Tente olhar para um arquivo de bitmap (.BMP) via lesse você verá os dois primeiros caracteres BM. Esse número mágico indica que o arquivo é realmente um bitmap.

Foo Bah
fonte
10

Se o arquivo em que esse script reside for executável, o hash-bang ( #!) informa ao sistema operacional qual intérprete usar para executar o script. Nesse caso, é /bin/sh, por exemplo.

Há um artigo da Wikipedia sobre isso para obter mais informações.

Kusalananda
fonte
5

A primeira linha informa ao shell que, se você executar o script diretamente (./run.sh; em oposição a / bin / sh run.sh), deverá usar esse programa (/ bin / sh nesse caso) para interpretá-lo.

Você também pode usá-lo para passar argumentos, geralmente -e (sair com erro) ou usar outros programas (/ bin / awk, / usr / bin / perl, etc).

Kevin
fonte
-4

#!/bin/shou #!/bin/bashprecisa ser a primeira linha do script, porque se você não o usar na primeira linha, o sistema tratará todos os comandos nesse script como comandos diferentes. Se a primeira linha for #!/bin/sh, ele considerará todos os comandos como um script único e mostrará que esse arquivo está sendo executado no pscomando e não os comandos dentro do arquivo.

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo
Sarvesh Pawar
fonte
1
O estouro de pilha não é o Twitter. Por favor, dedique um tempo para realmente soletrar palavras como "u" e "1st". Você está ajudando a escrever um livro de referência para que a gramática e a ortografia adequadas sejam significativas. Além disso, preste atenção à formatação correta. Os comandos que seriam emitidos a partir da linha de comando, como ps, e trechos de código como, #!/bin/shdevem ser formatados.
the Tin Man
Tentei limpar o inglês aqui, mas ainda não tenho certeza do que isso significa. Eu acho que a resposta tenta dizer que os comandos no script serão executados como comandos distintos e a adição de um shebang mostrará o script como um único comando em uma lista de processos. Isso não é verdade.
Tripleee