Como um script bash é executado através de seu nome de arquivo como nome do comando com e sem shebang?

0

Do manual do bash:

3.7.2 Command Search and Execution

After a command has been split into words, if it results in a simple command and an optional list of arguments, the following actions are taken.

...

  1. If the name is neither a shell function nor a builtin, and contains no slashes, Bash searches each element of $PATH for a directory containing an executable file by that name.

  2. If the search is successful, or if the command name contains one or more slashes, the shell executes the named program in a separate execution environment. Argument 0 is set to the name given, and the remaining arguments to the command are set to the arguments supplied, if any.

  3. If this execution fails because the file is not in executable format, and the file is not a directory, it is assumed to be a shell script and the shell executes it as described in Section 3.8 [Shell Scripts], page 39.

  1. Suponha que um script bash myscript não contenha um shebang.

    • A citação significa que, se o script for executado no bash por meio do comando myscript ,

      • O bash assumirá primeiro que é um ELF e chama execve() , e como é um script bash não ELF, execve() chamará,

      • o bash executará em seguida bash myscript ?

    • Em comparação com a execução de um script bash via bash myscript no bash, a execução do script via myscript no bash também terá um falha chamada para execve() no script diretamente?

    • Se sim, é myscript mais lento que bash myscript ? Por que " Um Guia Prático para Comandos, Editores e Programação Shell do Linux por Mark G. Sobell "diz o contrário?

      Although you can use bash to execute a shell script, this technique causes the script to run more slowly than giving yourself execute permission and directly invoking the script.

  2. Se um script bash myscript contiver uma shebang #! /bin/bash , quando é executado no bash via comando myscript ,

    • é executado da mesma forma que é executado no bash via comando bash myscript ?

    • é executado da mesma forma que o shebang foi removido do script e, em seguida, o script foi executado por meio do comando myscript ?

Obrigado.

Meu post é inspirado em Como está executando um script como um executável diferente de executá-lo por um shell explicitamente? e Qual interpretador de shell executa um script sem shebang?

    
por Tim 23.04.2018 / 05:41

1 resposta

3
    • Does the quote mean that if the script is executed in bash via command myscript, then

      • bash will first assume it is an ELF and calls execve() on it, and because it is a bash script not ELF, execve() call will fail,

      Se o Bash encontrar um arquivo executável, primeiro ele assumirá que está em algum formato que o sistema operacional pode executar e call execve on it . Caso isso seja bem-sucedido, isso ainda pode não ser um arquivo executável nativo ou ELF. Por exemplo, o recurso binfmt_misc do Linux permite que muitos outros formatos executáveis sejam executados. Nesse caso específico, a chamada execve provavelmente falhará.

      • bash will next execute bash myscript?

      O Bash usará seu subprocesso existente para executar o script dentro dele, reinicializando o ambiente de shell conforme necessário . Não há um processo adicional lançado ou exec chamada.

    • Compared to running a bash script via bash myscript in bash, running the script via myscript in bash will additionally have a failure call to execve() on the script directly?

      Sim, suponho que sim, se você quer dizer "uma falha na chamada".

    • If yes, is myscript slower than bash myscript? Why does "A Practical Guide to Linux Commands, Editors, and Shell Programming By Mark G. Sobell" say the opposite?

      Although you can use bash to execute a shell script, this technique causes the script to run more slowly than giving yourself execute permission and directly invoking the script.

      Conscientes das leis de calúnia prevalecentes, não comentarei a segunda parte dessa questão, mas até mesmo várias bibliotecas e & as chamadas de sistema não vão fazer uma diferença mensurável em comparação com o lançamento de todo um processo bash e, em seguida, interpretar um script. Não consigo acessar a página em questão para encontrar qualquer contexto que você possa ter perdido. É quase certo que não está discutindo o caso sem graça, no entanto.

  1. If a bash script myscript contains a shebang #! /bin/bash, when it is executed in bash via command myscript,

    • is it executed in the same way as it is executed in bash via command bash myscript?

    Sim; em um caso, bash myscript é exec ed diretamente pelo subprocesso e, no outro, o sistema exec s /bin/bash myscript , assim que encontrar a linha shebang.

    • is it executed in the same way as the shebang were removed from the script and then the script were executed via command myscript ?

    Na medida em que você pode razoavelmente detectar, sim. Nada disso importa. Estritamente, a função main() de bash não é executada novamente neste caso, porque o subprocesso apenas se reinicializa internamente e é executado na outra situação. Você pode construir um cenário em que isso seja importante se você estiver realmente interessada, mas não vale a pena o esforço.

Observe que essa é uma funcionalidade de Bash e outros shells executam scripts sem script com sh ou algum outro shell , em vez de bash ou de si próprios, conforme observado na outra pergunta que você vinculou. Também estamos assumindo que o seu shell interativo é o mesmo bash que o das suas linhas de shebang.

    
por 23.04.2018 / 07:22