Eu sou novo no shell scripts e muitos livros já escreveram que usam a linha #! (Sha-bang) no início do script para chamar o intérprete. E isso invocará um novo shell para o script e fará a interpretação linha por linha. do meu script básico ainda está sendo executado sem a linha mágica.
então minhas perguntas são:
- de onde meu script básico conseguiu o intérprete.
- como o script consegue localizar o intérprete.
Agora, deixe-me falar sobre meu script básico, que contém apenas a seguinte linha:
eco "script básico sem as linhas mágicas"
bash
shell-script
user1678213
fonte
fonte
Respostas:
Se a linha mágica não for fornecida, um shell padrão será usado para executar o script. Esse shell padrão pode ser o Bourne shell (sh), que é o caso em alguns tipos, no entanto, em outros tipos, o shell padrão usado é o mesmo que o shell de login para executá-lo. A questão é: não deixe que o sistema decida o shell, sempre forneça o shell que você deseja na primeira linha.
fonte
/bin/sh
, apenas para ser o primeirosh
executável encontrado ao explorar um PATH em conformidade.Quando você executa um programa, o kernel verifica se é iniciado por alguma sequência de bytes mágicos . Se o arquivo executável começar
#!
, o kernel interpreta o restante da linha como um nome de intérprete. Se o arquivo executável começar com\177ELF
(onde\177
é o byte 127), ele carregará o arquivo como um executável ELF ; esse é o tipo normal na maioria dos sistemas unix atualmente.Se o kernel não reconhecer o formato do arquivo, ele se recusará a executá-lo e retornará o erro ENOEXEC (erro de formato Exec). Quando o shell percebe isso, é necessário executar o programa como um script de shell.
Para testemunhar isso em ação, adicione alguns comandos ao seu script:
(Isso é para Linux, ajuste para outros departamentos.) Em seguida, tente executar esse script a partir de vários shells. Você verá que alguns shells geram novas instâncias para executar o script (bash, ksh93), enquanto outros geram
/bin/sh
(dash, pdksh, zsh).fonte
ls -l
comando? Isso:lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash
-? se sim, o que isso diz? Além disso, notei que estouSHELL=/bin/bash
usandoenv
, mas mudar isso não pareceu mudar o comportamento. Talvez não esteja relacionado?ls -l /proc/$$/exe
, de fato). Osexe
links apontam para o shell que está executando seu script. Ao executar seu script, você verá que é o bash que interpreta o script. Se você o executar, por exemplo, pdksh, ele será executado/bin/sh
. Não conheço nenhum shell que use aSHELL
variável de ambiente ou o shell de login nessa circunstância./etc/passwd
altera o que é executado quando você faz logon no SSH ou em um console de texto. Não muda qual shell pode executar scripts./etc/passwd
para decidir qual shell usar; eles bifurcaram uma instância de si mesmos ou foram executados/bin/sh
.Provavelmente é uma das três possibilidades a seguir:
Você está chamando o script diretamente com o intérprete, IE: bash script.sh
O nome do arquivo de script possui uma extensão .sh, que faz com que o sistema procure o programa padrão para esse tipo de arquivo
O ambiente de shell que você está usando está executando o 'eco' por si só, pois só posso supor que o arquivo de script é executável. Se, por exemplo, você usará um shell bash e tiver um comando em seu arquivo que é usado apenas pelo ksh, verá que ele não funcionará.
Boa sorte!
fonte