O que faz #! / Usr / bin / ... no início de uma média de arquivo?
-
13-09-2019 - |
Pergunta
Eu posso fazer algo parecido com isso em Haskell:
#!/usr/bin/runghc
main=putStrLn "Hello World"
Então eu posso executá-lo com ./hello.hs
A minha pergunta é, por que é a primeira linha ignorado? Comentários em Haskell começar com --
mas a primeira linha ainda parece ser ignorado. Ele ainda carrega em ghci. O truque também funciona com Python e Perl.
Mas quando eu faço algo semelhante em Java:
#!/usr/local/jdk1.6.0_13/bin/javac
...
Javac me dá um erro do compilador.
Então, como isso funciona e como é que eu obtê-lo para trabalhar com Java?
Graças.
Solução
#! é chamado de " shebang " e é uma maneira Unix da execução de scripts. Quando você pergunta o sistema operacional para executar um arquivo ele vai descobrir que este não é um arquivo .exe normal, e o #! no começo serve como um marcador mágico que instrui o sistema operacional para executar o comando após o #! e fiação até que o comando de modo que este arquivo se torna um argumento do comando
Se myfile.py contém
#!/usr/bin/python
executar esse arquivo não é muito diferente da execução
$ /usr/bin/python myfile.py
Meu Haskell conhecimento é pobre. Mas para o seu caso particular, parece o comando runghc simplesmente lê a primeira linha, analisa quaisquer argumentos dados em que #! linha, escreve o resto do arquivo para um arquivo temporário e corre GHC naquele arquivo temporário (que terá o primeiro lien retirados -. ver runghc.hs nas fontes ghc para mais informações)
Se você queria fazer a mesma coisa com javac você poderia usar a mesma abordagem que runghc. Escrever um invólucro, que se alimenta a primeira linha do arquivo, escreve o resto do arquivo para um arquivo temporário e corre javac nesse arquivo.
Outras dicas
Se o arquivo for hello.hs, ea primeira linha é "# / usr / bin / runghc!", Em seguida, o shell irá executar:
/usr/bin/runghc hello.hs
Essa primeira linha, basicamente diz ao shell o que usar para executar o script.
Quanto ao exemplo java, a primeira linha deve ser o executável que runs o script, não que compila do script.
A minha pergunta é, por que é a primeira linha ignorado? Comentários em Haskell começar com - mas a primeira linha ainda parece ser ignorado. Ele ainda carrega em ghci. O truque também funciona com Python e Perl.
O 'truque' funciona em Python e Perl porque #
começa um comentário nessas línguas, por isso o intérprete vê essa linha como um comentário e ignora-lo. Então, para eles, não é nada especial.
Em Haskell, #
não inicia um comentário, por isso não faria normalmente trabalho. No entanto, GHC (talvez também outras implementações, se a memória serve, abraços fiz isso também) tem um caso especial para linhas shebang. Se a primeira linha de um arquivo começa com #!
, ele é tratado como um comentário. Este desvio da especificação da linguagem foi incorporada exatamente a make
$ chmod +x hello.hs
$ ./hello.hs
trabalho. Ele não funciona com javac
porque não há nenhum caso especial incorporado que para as linhas shebang.
O shebang só funciona com linguagens interpretadas .... geralmente significa nada para um compilador que irá erro fora na maioria dos casos
A razão que isso funciona é porque Python, Perl, e, aparentemente, Haskell, são todas as linguagens interpretadas. É a forma padrão Unix para designar o intérprete que irá executar o script. Java é uma linguagem compilada, e não pode ser executado com um intérprete.
Javac é um compilador, não um intérprete.
Ela carece de modo interativo que, creio, é o que está causando a 'magia'. O mesmo não vai funcionar com o GCC, uma vez que não tem a mesma característica.
dmd (O compilador D), por exemplo, é um exemplo de um compilador que suporta interpertation tem esse tipo de edição interativa (#! / Usr / bin / DMD -run).
É o local do executável em seu computador para interpretar o seu script. Java é uma linguagem compilada, portanto, ele não precisa de tal declaração.
Além disso, o ponto é que é um comentário especial, a construção em Java não seria legal dessa forma como um # não é um marcador de comentário legal. Se uma construção como essa faria sentido ... o que não acontece ... ele ficaria assim:
//!/usr/local/jdk1.6.0_13/bin/javac
esta referência para a linha de organização através Wikipedia mas este parece ser a melhor artigo . Veja também O '#!' magic -. detalhes sobre o mecanismo de shebang em vários sabores de Unix