shell scripts ainda estão trabalhando sem #! (linha sha-bang)

10

Eu sou novo em shell scripts e muitos livros escreveram que usam linha #! (sha-bang) no início do script para invocar o interpretador. E isso invocará um novo shell para script e fará a interpretação linha por linha Mas um dos meus scripts básicos ainda está em execução sem a linha mágica.

então minhas perguntas são:

  • de onde meu script básico conseguiu o intérprete.
  • como o script conseguiu localizar o intérprete.

agora, deixe-me falar sobre meu script básico, ele contém apenas a seguinte linha:

echo "script básico sem as linhas mágicas"

    
por user1678213 10.10.2012 / 06:48

3 respostas

3

Se a linha mágica não for fornecida, um shell padrão será usado para executar o script. Este shell padrão pode ser Bourne shell (sh), que é o caso em alguns sabores, no entanto, em alguns outros sabores, o shell padrão usado é o mesmo que shell de login para executá-lo. A coisa é: não deixe para o sistema decidir o shell, sempre forneça o shell que você quer na primeira linha.

    
por 10.10.2012 / 08:04
7

Quando você executa um programa, o kernel verifica se ele inicia por alguma sequência de bytes mágicos . Se o arquivo executável começar com #! , o kernel interpretará o resto da linha como um nome de intérprete. Se o arquivo executável começar com 7ELF (onde 7 é o byte 127), ele carregará o arquivo como um ELF executável; esse é o tipo normal na maioria dos sistemas unix atualmente.

Se o kernel não reconhecer o formato do arquivo, ele se recusará a executar o arquivo e retornará o erro ENOEXEC (erro de formato Exec). Quando o shell percebe isso, ele se encarrega de executar o programa como um script de shell.

Para testemunhar isso em ação, adicione alguns comandos ao seu script:

ps l $$
ls -l /proc/$$/exe
echo hello

(Isto é para o Linux, ajuste para outros unices.) Em seguida, tente executar esse script a partir de vários shells. Você verá que alguns shells geram novas instâncias de si mesmos para executar o script (bash, ksh93) enquanto outros geram /bin/sh (dash, pdksh, zsh).

    
por 11.10.2012 / 02:25
-2

É provavelmente uma das três possibilidades a seguir:

  1. Você está chamando o script diretamente com o interpretador, ou seja: bash script.sh

  2. O nome do arquivo de script tem uma extensão .sh, que faz com que o sistema procure o programa padrão para esse tipo de arquivo

  3. O ambiente de shell que você está usando está executando o 'echo' sozinho, já que só posso imaginar que o arquivo de script é executável. Se, por exemplo, você estiver usando um shell bash e tiver um comando no seu arquivo que é usado apenas pelo ksh, você verá que ele não funcionará.

Boa sorte!

    
por 10.10.2012 / 08:00