Por que você precisa colocar #! / Bin / bas no início de um arquivo de script?

Eu fiz scripts Bash antes e todos eles correram bem sem isso no começo. Qual é o ponto de colocar isso? As coisas seriam diferentes?

Além disso, como você pronuncia # ? Eu sei disso ! é pronunciado como “bang”.

Como é #! pronunciado?

É uma convenção, então o shell * nix sabe que tipo de intérprete será executado.

Por exemplo, os tipos mais antigos de ATT eram padronizados como sh (o shell Bourne), enquanto versões mais antigas do BSD eram padronizadas como csh (o shell C).

Ainda hoje (onde a maioria dos sistemas executam o bash, o “Bourne Again Shell” ), scripts podem ser bash, python, perl, ruby, PHP, etc, etc. Por exemplo, você pode ver #!/bin/perl ou #!/bin/perl5 .

PS: O ponto de exclamação ( ! ) É carinhosamente chamado de “bang” . O símbolo de comentário do shell ( # ) às vezes é chamado de “hash” .

PPS: Lembre-se – sob * nix, associar um sufixo com um tipo de arquivo é meramente uma convenção , não uma “regra” . Um executável pode ser um programa binário, qualquer um de um milhão de tipos de script e outras coisas também. Daí a necessidade de #!/bin/bash .

Para ser mais preciso, o shebang #! , quando são os dois primeiros bytes de um arquivo executável ( x mode ), é interpretado pela chamada de sistema execve (2) (que executa programas). Mas a especificação POSIX para execve não menciona o shebang.

Ele deve ser seguido por um caminho de arquivo de um executável de intérprete (que BTW poderia ser relativo, mas na maioria das vezes é absoluto).

Um truque legal (ou talvez não tão legal ) para encontrar um interpretador (por exemplo, python ) no $PATH do usuário é usar o programa env (sempre em /usr/bin/env em todo o Linux) como por exemplo

  #!/usr/bin/env python 

Qualquer executável do ELF pode ser um intérprete. Você poderia até usar #!/bin/cat ou #!/bin/true se você quisesse! (mas isso seria muitas vezes inútil)

É chamado de shebang . Em unix-speak, # é chamado de sharp (como na música) ou hash (como hashtags no twitter) e! é chamado de bang. (Você pode realmente referenciar seu comando shell anterior com !!, chamado bang-bang). Então, quando juntos, você recebe haSH-BANG, ou shebang.

A parte depois do #! diz ao Unix qual programa usar para executá-lo. Se não for especificado, ele tentará com bash (ou sh, ou zsh, ou qualquer que seja sua variável $ SHELL), mas se estiver lá, ele usará esse programa. Além disso, # é um comentário na maioria dos idiomas, portanto, a linha é ignorada na execução subsequente.

O shebang é uma diretiva para o carregador usar o programa que é especificado após o #! como o intérprete para o arquivo em questão quando você tenta executá-lo. Portanto, se você tentar executar um arquivo chamado foo.sh que tenha #!/bin/bash no topo, o comando real que executa é /bin/bash foo.sh Esta é uma maneira flexível de usar diferentes interpretadores para diferentes programas. Isso é algo implementado no nível do sistema e a API no nível do usuário é a convenção shebang.

Também vale a pena saber que o shebang é um número mágico – um número legível que identifica o arquivo como um script para o interpretador fornecido.

Seu ponto sobre isso “trabalhar” mesmo sem o shebang é apenas porque o programa em questão é um script de shell escrito para o mesmo shell que o que você está usando. Por exemplo, você poderia muito bem escrever um arquivo javascript e depois colocar um #! /usr/bin/js #! /usr/bin/js (ou algo similar) para ter um javascript “Shell script”.

O sistema operacional usa o shell padrão para executar seu script de shell. Assim, mencionando o caminho do shell no início do script, você está solicitando ao sistema operacional que use esse shell específico. Também é útil para portabilidade .

Toda distribuição tem um shell padrão. Bash é o padrão na maioria dos sistemas. Se acontecer de você trabalhar em um sistema que tenha um shell padrão diferente, os scripts poderão não funcionar como planejado se forem escritos especificamente para o Bash.

Bash evoluiu ao longo dos anos, tomando o código de ksh e sh .

Adicionando #!/bin/bash como a primeira linha do seu script, o sistema operacional invoca o shell especificado para executar os comandos que seguem o script.

#! é frequentemente referido como “hash-bang”, “she-bang” ou “sha-bang”.

Isso é chamado de shebang . Ele consiste em um sinal numérico e um caractere de ponto de exclamação (#!), Seguido pelo caminho completo para o interpretador, como / bin / bash. Todos os scripts em UNIX e Linux são executados usando o interpretador especificado em uma primeira linha.

Pode ser útil para alguém que usa um sistema diferente que não tenha essa biblioteca prontamente disponível. Se isso não for declarado e você tiver algumas funções em seu script que não são suportadas por esse sistema, você deve declarar # / bin / bash. Eu corri para este problema antes no trabalho e agora eu apenas incluo isso como uma prática.