Existe alguma coisa Bash
objetivamente melhor do que as outras para a maioria dos usos?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
- etc
Lembro-me vagamente há muito tempo de ouvir que adicionar um traço ao final impede que alguém passe um comando para o seu script, mas não consegue encontrar detalhes sobre isso.
/usr/local/bin/bash
no OpenBSD.Respostas:
Você deve usar
#!/usr/bin/env bash
para portabilidade : diferentes * nixes são colocadosbash
em lugares diferentes, e usar/usr/bin/env
é uma solução alternativa para executar o primeirobash
encontrado noPATH
. Esh
não ébash
.fonte
/bin/sh
, etc).bash
não vive em/bin
todos os sistemas.alias shebang='echo "#!/usr/bin/env bash"'
agora eu só tenho que abrir o terminal e digitar shebang em vez de ir aqui.env
está em/usr/bin/env
. Poderia estar no local/bin/env
ou em qualquer lugar, desde que esteja no caminho. Poderia ser em/dummy/env
caso/dummy
está emPATH
. O Shebang em si é indefinido no POSIX, para que eu possa#!stop toaster
iniciar a máquina de café USB e ser compatível com POSIX. Portanto,#!/usr/bin/env bash
não é particularmente melhor do que#!/bin/bash
, poderia ser menos portátil, dependendo./usr/bin/env
existem em mais máquinas do que em qualquer um dos/bin/bash
xor/usr/bin/bash
, portanto, um script que começa com essa linha fará o esperado em tantas máquinas quanto possível./bin/sh
geralmente é um link para o shell padrão do sistema, que geralmente é ativadobash
, por exemplo, sistemas Debian é o peso mais levedash
. De qualquer forma, o shell Bourne original ésh
, portanto, se o seu script usa algunsbash
recursos específicos (2ª geração, "Bourne Again sh") ([[ ]]
testes, matrizes, várias coisas açucaradas, etc.), você deve ser mais específico e usar o posterior . Dessa forma, em sistemas em que o bash não está instalado, seu script não será executado. Entendo que pode haver uma emocionante trilogia de filmes sobre essa evolução ... mas isso pode ser um boato.Observe também que, quando evocado como
sh
,bash
até certo ponto se comporta como padrão POSIXsh
(consulte também a documentação do GNU sobre isso).fonte
/bin/sh
a nenhum lugar,/usr
pois isso dificultaria a execução dos scripts init antes da/usr
montagem./bin
e/sbin
durante anos ter sido apenas links simbólicos, por padrão, para/usr/bin
e/usr/sbin
, por isso, nesse contexto,/bin/sh
é um link parabash
e o real diretório é/usr/bin
. Mas eu vou corrigir o acima.Eu recomendo usar:
Não é 100% portátil (alguns sistemas são colocados
bash
em um local que não seja/bin
), mas o fato de muitos scripts existentes#!/bin/bash
pressionarem vários sistemas operacionais para fazer/bin/bash
pelo menos um link simbólico para o local principal.A alternativa de:
foi sugerido - mas não há garantia de que o
env
comando esteja/usr/bin
(e eu usei sistemas onde não está). Além disso, este formulário usará a primeira instância debash
nos usuários atuais$PATH
, que pode não ser uma versão adequada do shell bash.(Mas
/usr/bin/env
deve funcionar em qualquer sistema razoavelmente moderno, seja porqueenv
está dentro/usr/bin
ou porque o sistema faz algo para fazê-lo funcionar. O sistema que me referi acima foi o SunOS 4, que provavelmente não uso há cerca de 25 anos.)Se você precisar de um script para executar em um sistema que não possua
/bin/bash
, poderá modificá-lo para apontar para o local correto (isso é reconhecidamente inconveniente).Eu discuti as compensações em maior profundidade na minha resposta a esta pergunta .
Uma atualização um tanto obscura: um sistema que eu uso, o Termux , uma camada semelhante a um desktop Linux que roda no Android, não possui
/bin/bash
(bash
é/data/data/com.termux/files/usr/bin/bash
) - mas possui um tratamento especial para oferecer suporte#!/bin/bash
.fonte
Usar uma linha shebang para chamar o intérprete apropriado não é apenas para o BASH. Você pode usar o shebang para qualquer linguagem interpretada em seu sistema, como Perl, Python, PHP (CLI) e muitas outras. A propósito, o shebang
(também pode ser de dois hífens, ie
--
) termina as opções do bash que depois serão tratadas como nomes de arquivos e argumentos.O uso do
env
comando torna seu script portátil e permite configurar ambientes personalizados para o seu script, portanto, os scripts portáteis devem usarOu para qualquer idioma como o Perl
Não deixe de procurar nas
man
páginasbash
:e
env
:Nota: Nos sistemas Debian e baseados em Debian, como o Ubuntu,
sh
está vinculado adash
nãobash
. Como todos os scripts do sistema usamsh
. Isso permite que o bash cresça e o sistema permaneça estável, de acordo com o Debian.Além disso, para manter a invocação * nix como se eu nunca usasse extensões de arquivo em scripts invocados shebang, pois você não pode omitir a extensão na invocação em executáveis como no Windows. O comando file pode identificá-lo como um script.
fonte
Realmente depende de como você escreve seus scripts bash. Se você
/bin/sh
tiver o link simbólico para o bash, quando o bash for chamado comosh
, alguns recursos não estarão disponíveis .Se você deseja recursos específicos do bash e não POSIX, use
#!/bin/bash
fonte
pkg_add
, ele estará localizado em/usr/local/bin
, o que pode não estar no caminho.POSIX
recurso?