Introdução
Inicialmente, só tinha um shell no Unix. Quando executou um comando, o reservatório seria uma tentativa de invocar do exec () chamadas de sistema sobre ele. É o comando foi um executável, o exec teria sucesso e seria executado o comando. Se o exec () falhou, o reservatório não desista, em vez disso iria tentar interpretar o comando arquivo como se fosse um script. Isso funciona bem, desde que haja apenas um reservatório no sistema. Mas e se você estiver usando um shell como o seu interativos e deseja executar um script escrito em outro reservatório da língua?
Este é o lugar onde o #! truque vem polegadas A idéia de utilizar # para representar um comentário originou com csh rapidamente e foi adicionado ao Bourne Shell. Agora todos sabem reservatórios para ignorar coisas depois de um #. Então, nós podemos adicionar uma linha conduzindo algo como "#! / Usr / bin / ksh". Para o reservatório esta linha é apenas um comentário. Mas, se o kernel tenta executar um arquivo com esta linha, ele irá executar um determinado intérprete e passar o script para ele. Então shell scripts executáveis tornou bastante similar reais são executáveis. Agora, quando um shell tenta executar um script, é bem sucedido.
E se você sair fora do #! linha? Bem, o kernel exec irá falhar. Sua média shell tentará então executar o script em si. A poucos reservatórios tentará inspeccionar o script para tentar adivinhar o idioma. Isto não é bom. Você pode estar executando ksh interativos como seu reservatório e escrita ksh scripts. Se mais tarde mudar para bash como um shell interativo, alguns dos seus scripts podem continuar a correr, enquanto outros podem falhar. Também a linha
é um comentário que fornece uma pista importante para um programador que olha para o script para compreendê-lo. Sabendo que língua o autor está tentando usar é uma grande ajuda.
Embora eu tenha usado o termo "casca", na verdade essa técnica pode ser usada com muitos programas que não são conchas. Aqui está um "script" para exibir uma mensagem multiline:
Código:
#! /usr/bin/cat
Line 1
Line 2
Line 3
Isto irá mostrar que "#! / Usr / bin / cat" linha, mas que não seja, funciona bastante bem.
Passando um Argumento
Você pode passar um único argumento como este:
#! / usr / local / bin /
perl -w
Mas, em geral, está limitado a
um argumento. Na maioria dos sistemas, uma linha como: "#! / Some / intérprete-a-b" resultará em "-a-b" são passadas como um único argumento. No entanto, o único argumento não se limita a começar com um hífen. Nós podemos melhorar a nossa mensagem script:
Código:
#! /usr/bin/sed 1d
Line 1
Line 2
Line 3
Exemplo
Vamos colocar todos do presente, juntamente com um exemplo. Aqui está um
perl script que vou chamar perlargs:
Código:
#! /usr/local/bin/perl -w
#! /usr/local/bin/perl -w
print "script name is ", $0, "\n";
while (@ARGV) {
$ARGV = shift @ARGV;
print "argument ", $i++, " is ", $ARGV, "\n";
}
system "ps -f -ww";
A pergunta-w
perl emissão de mensagens de aviso. O script simplesmente exibe seus argumentos e, em seguida, executa o comando ps. Quando eu executá-lo, eu recebo:
Código:
$ ./perlargs one two three
Name "main::i" used only once: possible typo at ./perlargs line 10.
script name is ./perlargs
argument 0 is one
argument 1 is two
argument 2 is three
UID PID PPID STIME TTY TIME CMD
perderabo 69 1 17:47:28 n01 0:00.24 /bin/ksh -l
perderabo 201 69 18:28:22 n01 0:00.03 /usr/local/bin/perl -w ./perlargs one two three
perderabo 2055 201 18:28:22 n01 0:00.01 ps -f -ww
$
Observe que o
perl processo foi chamado com 5 argumentos. O 2 º argumento é o nome do script. Cabe ao
perl processo para apresentar os últimos 3 argumentos como o argumento lista visto pelo script. Também comecei a perceber que o kernel
perl processo. Depois disso, cabe aos
perl para abrir o livro e lê-lo e executar cada linha. Esta é a razão pela qual scripts precisam ser legíveis. Você não pode executar um script não-legível.
Conclusão
Esta informação deverá ser suficiente para entender o que está acontecendo com esses #! linhas. Nos lugares seguintes, vou acrescentar mais pormenores sobre os vários aspectos do processo.