Qual é o idioma que aparece na primeira linha de um script? [duplicado]

2

Os scripts Bash começam com a seguinte linha

#!/bin/bash
# Rest of script below
...

Em bash , o caractere # é o início de um comentário, mas #!/bin/bash definitivamente não é um comentário, portanto não é bash mas o kernel que interpreta essa afirmação.

Então, o que exatamente é essa primeira linha? É uma linguagem específica ou um caso especial no kernel do Linux? Existem outros comandos ou instruções nesta "linguagem" que podem ser usados durante a criação de scripts?

    
por Cory Klein 06.11.2013 / 01:04

3 respostas

2

Chamado de shebang, como Ignacio disse, é na verdade um pouco de mágica para o carregador de programas no sistema operacional. Quando um usuário tenta executar um programa, o carregador lê os dois primeiros bytes do programa para aprender {algo}. Se esses dois bytes forem exatamente # e!, O kernel lerá tudo, desde o byte três até a primeira nova linha (em muitos sistemas, é uma nova linha). Ele usa a string que encontra como um nome de caminho e, em seguida, se ele pode executar o que estiver no nome do caminho, ele faz e alimenta o restante do primeiro arquivo de programa para esse executável como entrada.

Aqueles que querem uma explicação mais polida podem procurar no google "shebang kernel magic" e seguir o link para a entrada da Wikipedia no tópico link

    
por 06.11.2013 / 01:21
2

O shebang ( #! ) é chamado de número de magia . #! é a forma legível dos 2 bytes 0x23 e 0x21. Se você vir a man page para a função C execve() , a família dessas funções executivas está captando esses bytes e se comportando de maneira diferente quando presente.

trecho da página man execve ()

DESCRIPTION
       execve()  executes the program pointed to by filename.  filename must be 
       either a binary executable, or a script starting with a line of the form:

           #! interpreter [optional-arg]

       For details of the latter case, see "Interpreter scripts" below.

       argv is an array of argument strings passed to the new program.  envp is 
       an array of strings, conventionally of the  form key=value,  which are 
       passed as environment to the new program.  Both argv and envp must be 
       terminated by a null pointer. The argument vector and environment can be 
       accessed by the called program's main function, when it is defined as:

           int main(int argc, char *argv[], char *envp[])

       execve() does not return on success, and the text, data, bss, and stack 
       of the calling process are overwritten by that of the program loaded.

       If the current program is being ptraced, a SIGTRAP is sent to it after a
       successful execve().

O olho agudo notará que a forma do shebang leva apenas 2 argumentos. Sendo um deles o intérprete, o outro é um [optional-arg] . É por isso que você não pode passar mais do que 1 argumento, pelo menos no Linux.

Portanto, comandos como esse não funcionarão, o -f é ignorado, acredito.

#!/usr/bin/foo -i -f

No entanto, se o intérprete suportá-lo, você pode contornar essa limitação de certa forma:

#!/usr/bin/foo -if
    
por 06.11.2013 / 01:21
2

Esse é o shebang . Qualquer programa que aceite um nome de arquivo como argumento pode ser especificado ali, e o nome do arquivo do script é passado.

$ cat t.ex
#!/bin/cat
I have been cat!
$ ./t.ex
#!/bin/cat
I have been cat!
    
por 06.11.2013 / 01:07