Qual é a função do bash shebang? [duplicado]

12
  • Qual é a função do bash shebang?
  • Qual é a diferença entre a execução de um arquivo usando ./file ou sh file ?
    • Como o bash entende isso?
por Daniel 29.03.2017 / 09:14

4 respostas

10
  • A função do shebang é:

Interpreter directives allow scripts and data files to be used as commands, hiding the details of their implementation from users and other programs, by removing the need to prefix scripts with their interpreter on the command line.

  • Qual é a diferença entre executar um arquivo usando ./file ou sh file?

A Bourne shell script that is identified by the path some/path/to/foo, has the initial line,

    #!/bin/sh -x

and is executed with parameters bar and baz as

    some/path/to/foo bar baz

provides a similar result as having actually executed the following command line instead:

    /bin/sh -x some/path/to/foo bar baz

Note: On 1980 Dennis Ritchie introduced kernel support for interpreter directives:

The system has been changed so that if a file being executed
begins with the magic characters #! , the rest of the line is understood
to be the name of an interpreter for the executed file.
Previously (and in fact still) the shell did much of this job;
it automatically executed itself on a text file with executable mode
when the text file's name was typed as a command.
Putting the facility into the system gives the following
benefits.

1) It makes shell scripts more like real executable files,
because they can be the subject of 'exec.'

2) If you do a 'ps' while such a command is running, its real
name appears instead of 'sh'.
Likewise, accounting is done on the basis of the real name.

3) Shell scripts can be set-user-ID.

Note: Linux ignores the setuid bit on all interpreted executables (i.e. executables starting with a #! line).

4) It is simpler to have alternate shells available;
e.g. if you like the Berkeley csh there is no question about
which shell is to interpret a file.

5) It will allow other interpreters to fit in more smoothly.

Mais informações:

por 29.03.2017 / 09:29
9

A função do hashbang é dizer ao kernel qual programa executar como interpretador de scripts quando o arquivo é executado.

A execução de ./program faz exatamente isso e requer permissão de execução no arquivo, mas é independente do tipo de programa que é. Pode ser um script bash, um script sh ou um script Perl, Python, awk ou expect ou um executável binário real. A execução de sh program forçaria a execução sob sh , em vez de qualquer outra coisa.

Observe que sh é diferente de bash ! O último tem vários recursos avançados não conhecidos pelo shell padrão. Dependendo do sistema, sh pode ser outro programa ou Bash no modo de compatibilidade, mas o resultado geralmente é o mesmo: qualquer recurso avançado está inacessível.

O Bash em si não entende a linha hashbang, mas depende do kernel para lê-lo. Por outro lado, o interpretador Perl também lê a linha hashbang por si só, independentemente de como ela foi iniciada: ela faz isso para escolher qualquer opção de linha de comando configurada na linha de hashbang. Bash não faz isso.

Por exemplo, o script a seguir tem um comportamento diferente dependendo se ele é iniciado como ./script (através de exec e da linha hashbang) ou com bash script (executando o interpretador bash manualmente):

#!/bin/bash -u
echo $1
    
por 29.03.2017 / 10:02
4

bash em si não atribui qualquer significado à linha shebang, apenas a vê como um comentário. Quando o shell lê uma linha de comando e o comando é um programa externo (não um comando interno como cd ), ele executa o comando usando a chamada de sistema execve . O kernel então examina o tipo de executável que o arquivo passou para execve , verificando o número mágico no início do arquivo. Se o número mágico consiste nos dois bytes 0x23 0x21 (caracteres ASCII #! ), o kernel assume que eles são seguidos pelo caminho absoluto do intérprete do script. O kernel então inicia o interpretador, passando o script para ele.

    
por 29.03.2017 / 09:55
0

Bem, para ser 100% preciso, não há muito sobre um "bash shebang". Um shebang pode aparecer em várias formas. É simplesmente uma indicação de intérprete. Então, um shebang de, digamos, #!/usr/bin/perl f.ex. seja um "perl shebang" e indique o intérprete de perl como o intérprete para tal schript. Você poderia então chamar tal script perl como qualquer script de shell diretamente. O mesmo significa qualquer outro interpretador de scripts. Isso pode ser php, ou cshell, ou prólogo, ou básico ou qualquer outra coisa que interprete arquivos de texto de alguma forma. E, claro, esse intérprete deve ser capaz de ignorar a shebang. Para bash é simplesmente uma linha de comentário. O mesmo vale para php e perl. Eu acho que o prólogo iria sufocar nessa linha embora. O shebang também deve trabalhar sem costura com o seu próprio aplicativo, contanto que isso seja capaz de interpretar o texto e ignorar o shebang.

Seria interessante se f.ex. um intérprete JavaScript seria capaz de ignorar tal "Javascript shebang":)

    
por 29.03.2017 / 16:48