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/sh
no início?
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/sh
no início?
Respostas:
É 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/whatever
parte, que de outra forma poderia ser um erro de sintaxe nessa linguagem específica.
exec()
sistema no arquivo.
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 less
e você verá os dois primeiros caracteres BM
. Esse número mágico indica que o arquivo é realmente um bitmap.
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.
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).
#!/bin/sh
ou #!/bin/bash
precisa 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 ps
comando 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
ps
, e trechos de código como, #!/bin/sh
devem ser formatados.