Já vi em vários lugares, incluindo recomendações neste site ( qual é o Bash shebang preferido? ), Para usar #!/usr/bin/env bash
preferencialmente #!/bin/bash
. Eu já vi um indivíduo empreendedor sugerir usando#!/bin/bash
estava errado e a funcionalidade do bash seria perdida ao fazer isso.
Tudo isso dito, eu uso o bash em um ambiente de teste rigidamente controlado, onde cada unidade em circulação é essencialmente um clone de uma única unidade mestre. Entendo o argumento da portabilidade, embora não seja necessariamente aplicável no meu caso. Existe algum outro motivo para preferir #!/usr/bin/env bash
as alternativas e, assumindo que a portabilidade era uma preocupação, existe algum motivo para usá-lo que poderia quebrar a funcionalidade?
env
pode não estar localizado em/usr/bin
. Comentários Shebang são completamente uma má idéia IMHO. Se o seu interpretador de script padrão não manipular comentários shebang, é apenas um comentário. No entanto, se você sabe que o intérprete de script pode lidar com comentários shebang e você conhece o caminho para o bash, não há razão para não invocá-lo usando seu caminho absoluto, a menos que o caminho seja muito longo (improvável) ou você possa portar o script para um sistema que não possui bash localizado em / bin. Por outro lado, as advertências que mencionei anteriormente se aplicam nesse caso, pois envolve portabilidade./etc
ou/bin/sh
.bash
é um complemento para a maioria dos sistemas similares ao Unix. É apenas o Linux ondebash
é garantido estar/bin
e provavelmente também está vinculado como/bin/sh
. Desde que o Linux se tornou o moderno Unix de fato para muitas pessoas, o fato de outros sistemas que não o Linux existirem foi esquecido. Na minha própria resposta abaixo, assumi o Linux porque você dissebash
. Muitas das caixas BSD com as quais trabalhei nem sequer a instalaram./bin/bash
. O Bash não está instalado por padrão. Se você quiser, você precisapkg install bash
. Uma vez instalado, ele está localizado em/usr/local/bin/bash
. Não há nada instalado no/bin/bash
OpenBSD. Um shebang de#!/bin/bash
vontade de erro, e#!/usr/bin/env bash
terá sucesso.Respostas:
#!/usr/bin/env
pesquisasPATH
parabash
, ebash
nem sempre está em/bin
, particularmente em sistemas não-Linux. Por exemplo, no meu sistema OpenBSD, ele está/usr/local/bin
instalado, pois foi instalado como um pacote opcional.Se você tem absoluta certeza de que
bash
está dentro/bin
e sempre estará, não há mal em colocá-lo diretamente em sua mente - mas eu recomendaria isso porque todos os scripts e programas têm uma vida além do que inicialmente acreditamos que eles terão.fonte
env
localização? O POSIX não o força./usr/lib/sendmail
(ou, mais recentemente/usr/sbin/sendmail
) disponível para processar e-mails, é do interesse de um sistema semelhante ao Unix,/usr/bin/env
porque o ambiente é uma prática comum. É uma interface padrão de fato.env
, mas de alguma forma não ter uma localização padrão (que pode ser apenas um link suave)bash
. Sem mencionar, por que então o hashbang não aceita apenas#!bash
e usa oPATH
, em vez de fazer exatamente o mesmo comenv
. Não é confuso o suficiente para novatos, eu acho.This mostly works because the path /usr/bin/env is commonly used for the env utility
aqui en.wikipedia.org/wiki/Shebang_(Unix) - Devemos confiar emenv
estar lá "provavelmente" em todos os sistemas.env
estava/bin
, não no/usr/bin
(não tenho certeza de qual deles, provavelmente SunOS 4). Hoje em dia é muito provável/usr/bin/env
que esteja disponível, apenas por causa da popularidade do#!/usr/bin/env
hack.A localização padrão do bash é
/bin
e suspeito que isso seja verdade em todos os sistemas. No entanto, e se você não gostar dessa versão do bash? Por exemplo, eu quero usar o bash 4.2, mas o bash no meu Mac está em 3.2.5.Eu poderia tentar reinstalar o bash,
/bin
mas isso pode ser uma má ideia. Se eu atualizar meu sistema operacional, ele será substituído.No entanto, eu poderia instalar o bash in
/usr/local/bin/bash
e configurar meu PATH para:Agora, se eu especificar
bash
, não entendo o antigo e bruto/bin/bash
, mas o mais novo e mais brilhante/usr/local/bin
. Agradável!Exceto que meus scripts de shell têm essa
!# /bin/bash
aparência. Portanto, quando executo meus scripts de shell, obtenho a versão antiga e ruim do bash que nem sequer possui matrizes associativas.Usar
/usr/bin/env bash
usará a versão do bash encontrada no meu PATH. Se eu configurar meu PATH, para que/usr/local/bin/bash
seja executado, essa será a base que meus scripts usarão.É raro ver isso com o bash, mas é muito mais comum no Perl e Python:
/bin
?/usr/bin
?/opt/bin
? Quem sabe? Usar#! /usr/bin/env perl
significava que eu não precisava saber.E agora, por que você não deve usar
#! /usr/bin/env bash
Quando o caminho é codificado no shebang, eu tenho que correr com esse intérprete. Assim,
#! /bin/bash
me obriga a usar a versão padrão instalada do bash. Como os recursos do bash são muito estáveis (tente executar uma versão 2.x de um script Python no Python 3.x), é muito improvável que meu script BASH em particular não funcione, e como meu script bash provavelmente é usado por esse sistema e outros sistemas , o uso de uma versão não padrão do bash pode ter efeitos indesejados. É muito provável que eu queira ter certeza de que a versão padrão estável do bash seja usada com meu script de shell. Assim, eu provavelmente quero codificar o caminho no meu shebang.fonte
Invocar
bash
é um pouco exagerado. A menos que você tenha váriosbash
binários como o seu em ~ / bin, mas isso também significa que seu código depende de $ PATH ter as coisas certas.É útil para coisas como isso
python
. Existem scripts e ambientes de wrapper que levam apython
binários alternativos sendo usados.Mas nada se perde usando o caminho exato para o binário, desde que você tenha certeza de que é o binário que realmente deseja.
fonte
python
. Eu perdi a conta do número de lugares quepython
podem ser encontrados 😀/usr/bin/env
é mais útil para Python, especialmente se você usar virtualenv.Existem muitos sistemas que não possuem o Bash
/bin
, FreeBSD e OpenBSD apenas para citar alguns. Se o seu script for portátil para muitos Unices diferentes, convém usá-lo em#!/usr/bin/env bash
vez de#!/bin/bash
.Observe que isso não é verdadeiro para
sh
; para scripts Bourne compatíveis I exclusivamente usar#!/bin/sh
, desde que eu acho que praticamente todos os Unix na existência temsh
em/bin
.fonte
/bin
dir, eu vejosh -> dash
. Simbolicamente vinculado adash
, revelando a natureza Debian do Ubuntu. Executar estas três cadeias de comando para perceber que tudo se resume a preferência individual:which bash
em seguida,which sh
em seguidawhich dash
.Eu preferiria agrupar o programa principal em um script como abaixo para verificar todos os
bash
disponíveis no sistema. Melhor ter mais controle sobre a versão usada.fonte
é definitivamente melhor porque encontra o caminho executável do bash a partir da variável de ambiente do sistema.
Vá para o seu shell Linux e digite
Ele imprimirá todas as suas variáveis de ambiente.
Vá para o seu shell script e digite
Ele imprimirá o caminho do bash (de acordo com a lista de variáveis de ambiente) que você deve usar para criar o caminho correto do shebang em seu script.
fonte