Je sais que je peux utiliser soit la première ligne de scripts pour invoquer le shell souhaité.
Serait #!/bin/sh
recommandé si la compatibilité avec tous les systèmes Unix est une exigence absolue?
Dans mon cas, les seuls OS dont je me soucie sont Ubuntu (Debian) et OSX. Étant donné que, puis-je utiliser #!/bin/bash
et être assuré que cela fonctionnerait sur les deux systèmes?
Cela faciliterait-il également l'utilisation de scripts avec une syntaxe plus moderne et plus claire pour les commandes? L'utilisation #!/bin/sh
concerne- t-elle également l'utilisation de POSIX?
/bin
et/usr/bin
. En conséquence, il est probablement préférable d'utiliser la#!/usr/bin/env <shname>
portabilité de nos jours.Réponses:
Pour commencer, si vous pouvez faire l'hypothèse que Bash est préinstallé (ce qui, à ma connaissance, est le cas sur tous les systèmes que vous répertoriez), utilisez le hashbang suivant pour être compatible:
cela appelle tout ce qui
bash
se passe à configurer, que ce soit dans/bin
ou/usr/local/bin
.Alors que sur la plupart des systèmes à travers une large gamme (y compris AIX, Solaris, plusieurs versions BSD),
bash
se sont retrouvés à différents endroits, se sontenv
toujours retrouvés/usr/bin/env
. L'astuce, cependant, n'est pas la mienne mais celle de l'auteur du Bash Cookbook.Quoi qu'il en soit, oui, Bash vous permettrait d'utiliser des fonctionnalités "modernes" qui vous simplifient la vie.
Par exemple les doubles crochets:
alors que dans les dialectes shell traditionnels, il faudrait recourir à:
mais le meilleur des crochets doubles est qu'ils autorisent les expressions régulières pour la correspondance. Le wiki Bash Hackers vous donnera de nombreuses astuces dans cette direction.
Vous pouvez également utiliser des expressions assez pratiques comme
$((2**10))
ou d'autres expressions arithmétiques en ligne avec la$((expression))
syntaxe.L'utilisation de backticks pour les sous-coquilles est correcte, bien qu'un peu dépassée. Mais les capacités d'imbrication des
$(command ...)
invocations sont bien plus pratiques car vous n'aurez pas à échapper à beaucoup de choses à différents niveaux de sous-shell.Ce ne sont que quelques choses que Bash vous donne sur la
sh
syntaxe POSIX commune traditionnelle .Mais si vous voulez plus de puissance sur le shell (pas seulement dans les scripts), jetez également un œil à
zsh
.la source
sh
ces tâches.sh
liés àbash
, la vulnérabilité ne sera pas atténuée par l'utilisationsh
.Dans Debian et Ubuntu,
/bin/sh
isdash
, qui est un shell compatible POSIX. Si vous spécifiez#!/bin/sh
, vous devez vous limiter aux instructions POSIX dans votre script. (L'avantage étant qu'ildash
démarre plus rapidement quebash
, de sorte que votre script peut faire son travail en moins de temps.)Sur de nombreux (la plupart?) Autres systèmes Linux,
/bin/sh
c'est labash
raison pour laquelle de nombreux scripts sont écrits avec#!/bin/sh
leur ligne shebang même s'ils utilisent desbash
extensions.Si vous souhaitez utiliser des
bash
extensions, l'approche la plus sûre sur tous les systèmes consiste à spécifier#!/bin/bash
; de cette façon, vous déclarez explicitement votre dépendancebash
. Vous devez le faire sur Debian et Ubuntu. En prime, une fois démarré, il/bin/sh
bash
désactive certaines extensions (voir la description dubash
mode POSIX pour plus de détails); il#!/bin/bash
est donc nécessaire de spécifier pour bénéficier pleinement debash
.Sur OS X
/bin/bash
est également disponible, et l'/bin/sh
estbash
. La spécification#!/bin/bash
fonctionnera également bien là-bas.la source
Oui, OSX et Linux seront fournis avec
/bin/bash
. Vous devriez être parfaitement en sécurité. Cependant, ce n'est pas POSIX. Le shell POSIX est/bin/sh
sur la plupart (tous?) Des systèmes et c'est l'approche la plus portable et la seule façon d'être compatible POSIX.Notez que tandis que sur de nombreux systèmes
/bin/sh
pointe versbash
, sur d'autres, il peut pointer vers différents shells. C'est un lien symbolique versdash
Debian et Ubuntu par exemple. De plus, même s'il/bin/sh
s'agit d'un lien versbash
, le comportement du shell change quand il est appelé commesh
(fromman bash
, accent mine):la source
Si la compatibilité avec "tous les systèmes Unix" est une exigence absolue - et si ce n'est pas le cas, pourquoi écrivez-vous un script shell? - alors, oui, vous devriez utiliser
#! /bin/sh
, car Bash n'est pas garanti d'être installé n'importe où , et encore moins à l'intérieur/bin
.C'est en fait bien, bien pire que ça. Si vous avez besoin de compatibilité avec tous les systèmes Unix, cela inclut des choses comme Solaris et AIX qui ont gelé leurs environnements shell vers 1995. Ce qui signifie que vous devez utiliser des choses comme l'ancienne
sort +N
syntaxe - que les nouveaux systèmes ont abandonné! Et cela signifie également pas de fonctions shell, pas de tableaux, non[[ ... ]]
, non${foo#glob}
, non$(( ... ))
pour l'arithmétique, éventuellement pas de$( ... )
substitution de commande de style, de petites limites supérieures non documentées sur la taille des entrées, ...Vous pouvez probablement vous en sortir sans se soucier de cette compatibilité beaucoup, mais si elle est encore un problème en premier lieu, je recommande fortement que vous considérez une langue qui est moins terrible que la coquille. L'interpréteur Perl de base est plus susceptible d'être disponible que Bash.
la source