Eu sei que posso usar como a primeira linha de scripts para invocar o shell desejado.
Seria #!/bin/sh
recomendado se a compatibilidade com todos os sistemas unix fosse um requisito absoluto?
No meu caso, os únicos sistemas operacionais com os quais me preocupo são o Ubuntu (Debian) e o OSX. Dado isso, eu poderia usar #!/bin/bash
e ter certeza de que funcionaria nos dois sistemas?
Isso também tornaria mais fácil o uso de scripts com sintaxe mais moderna e clara para comandos? O uso #!/bin/sh
também está relacionado ao uso do POSIX?
/bin
e/usr/bin
. Consequentemente, provavelmente é melhor usar#!/usr/bin/env <shname>
a portabilidade hoje em dia.Respostas:
Para iniciantes, se você puder supor que o Bash esteja pré-instalado (que, pelo que sei é o caso em todos os sistemas listados), use o seguinte hashbang para ser compatível:
isso chama o que quer
bash
que esteja configurado, não importa se está dentro/bin
ou/usr/local/bin
.Enquanto na maioria dos sistemas em uma ampla variedade (incluindo AIX, Solaris, vários tipos de BSD),
bash
acabavam em locais diferentes,env
sempre terminavam em/usr/bin/env
. O truque, no entanto, não é meu, mas do autor do Bash Cookbook.De qualquer forma, sim, o Bash permitirá que você use alguns recursos "modernos" que facilitam sua vida.
Por exemplo, os colchetes duplos:
enquanto nos dialetos shell tradicionais você teria que recorrer a:
mas o melhor dos colchetes duplos é que eles permitem expressões regulares para correspondência. O Bash Hackers Wiki lhe dará muitos truques nessa direção.
Você também pode usar expressões bastante convenientes, como
$((2**10))
outras expressões aritméticas, alinhadas com a$((expression))
sintaxe.Usar backticks para subshells é bom, embora um pouco desatualizado. Mas os recursos de aninhamento de
$(command ...)
invocações são muito mais convenientes, pois você não precisará escapar de muitas coisas em diferentes níveis de subcamadas.Essas são apenas algumas das coisas que o Bash fornece sobre a
sh
sintaxe POSIX comum tradicional .Mas se você quiser mais poder no shell (não apenas nos scripts), também dê uma olhada
zsh
.fonte
sh
essas tarefas.sh
vinculados abash
, a vulnerabilidade não será atenuada pelo usosh
.No Debian e no Ubuntu,
/bin/sh
isdash
, que é um shell compatível com POSIX. Se você especificar#!/bin/sh
, deverá limitar-se às instruções POSIX em seu script. (A vantagem é quedash
começa mais rápido quebash
, para que seu script possa ser executado em menos tempo.)Em muitos (a maioria?) De outros sistemas Linux,
/bin/sh
ébash
por isso que muitos scripts são escritos com#!/bin/sh
sua linha shebang, mesmo usandobash
extensões.Se você deseja usar
bash
extensões, a abordagem mais segura em todos os sistemas é especificar#!/bin/bash
; dessa forma, você está explicitamente declarando sua dependênciabash
. Você precisa fazer isso no Debian e no Ubuntu. Como um bônus adicional, quando iniciado como/bin/sh
bash
desativa algumas extensões (consulte a descrição dobash
modo POSIX para obter detalhes); portanto,#!/bin/bash
é necessário especificar para obter todos os benefíciosbash
.No OS X também
/bin/bash
está disponível e/bin/sh
estábash
. A especificação#!/bin/bash
também funcionará bem lá.fonte
Sim, o OSX e o Linux virão
/bin/bash
. Você deveria estar perfeitamente seguro. No entanto, isso não é POSIX. O shell POSIX está presente na/bin/sh
maioria dos sistemas (todos?) E essa é a abordagem mais portátil e a única maneira de ser compatível com POSIX.Observe que enquanto em muitos sistemas
/bin/sh
aponta parabash
, em outros, pode apontar para diferentes shells. É um link simbólico para odash
Debian e Ubuntu, por exemplo. Além disso, mesmo que/bin/sh
haja um link parabash
, o comportamento do shell muda quando é chamado comosh
(deman bash
, ênfase minha):fonte
Se a compatibilidade com "todos os sistemas Unix" é um requisito absoluto - e, se não, por que você está escrevendo um shell script? - então, sim, você deve estar usando
#! /bin/sh
, porque não é garantido que o Bash seja instalado em qualquer lugar , muito menos dentro/bin
.Na verdade, é muito, muito pior que isso. Se você precisa de compatibilidade com todos os sistemas Unix, isso inclui coisas como Solaris e AIX que congelaram seus ambientes de shell por volta de 1995. O que significa que você precisa usar coisas como a
sort +N
sintaxe antiquada - que os sistemas mais novos caíram! E isso também significa que não há funções de shell, sem matrizes, não[[ ... ]]
, não${foo#glob}
, não$(( ... ))
para$( ... )
substituição aritmética, possivelmente sem estilo de comando, limites superiores pequenos e não documentados sobre o tamanho da entrada, ...Você pode provavelmente começar afastado com não se preocupar com que tanto a compatibilidade, mas se ele é mesmo um problema, em primeiro lugar, eu recomendo fortemente que você considere uma linguagem que é menos terrível do que shell. É mais provável que o intérprete básico de Perl esteja disponível que o Bash.
fonte