J'ai vu dans un certain nombre d'endroits, y compris des recommandations sur ce site ( quel est le shebang Bash préféré? ), À utiliser #!/usr/bin/env bash
de préférence #!/bin/bash
. J'ai même vu une personne entreprenante suggérer que l'utilisation #!/bin/bash
était incorrecte et la fonctionnalité bash serait perdue en faisant cela.
Cela dit, j'utilise bash dans un environnement de test étroitement contrôlé où chaque disque en circulation est essentiellement un clone d'un seul disque maître. Je comprends l'argument de la portabilité, bien qu'il ne soit pas nécessairement applicable dans mon cas. Y a-t-il une autre raison de préférer #!/usr/bin/env bash
les alternatives et, en supposant que la portabilité était un problème, y a-t-il une raison de l'utiliser pourrait casser la fonctionnalité?
env
peut ne pas se trouver à/usr/bin
. Les commentaires de Shebang sont tout à fait une mauvaise idée à mon humble avis. Si votre interpréteur de script par défaut ne gère pas les commentaires shebang, il s'agit simplement d'un commentaire. Cependant, si vous savez que l'interpréteur de script peut gérer les commentaires shebang et que vous connaissez le chemin d'accès à bash, il n'y a aucune raison de ne pas l'invoquer en utilisant son chemin absolu, sauf si le chemin est trop long (peu probable), ou vous pouvez éventuellement porter le script à un système qui n'a pas bash situé dans / bin. Là encore, les mises en garde que j'ai mentionnées précédemment s'appliquent dans ce cas car cela implique la portabilité./etc
ou/bin/sh
.bash
est un module complémentaire pour la plupart des systèmes de type Unix. Ce n'est que Linux où ilbash
est garanti d'être intégré/bin
et très probablement également lié en tant que/bin/sh
. Depuis que Linux est devenu l'Unix de facto moderne pour beaucoup de gens, le fait qu'il puisse exister des systèmes autres que Linux a été oublié. Dans ma propre réponse ci-dessous, j'ai supposé Linux parce que vous avez ditbash
. Beaucoup de boîtiers BSD avec lesquels j'ai travaillé ne l'ont même pas installé./bin/bash
. Bash n'est pas installé par défaut. Si vous le voulez, vous devezpkg install bash
. Une fois installé, il se trouve à/usr/local/bin/bash
. Il n'y a rien installé/bin/bash
sur OpenBSD. Un coup de#!/bin/bash
volonté d'erreur, et#!/usr/bin/env bash
réussira.Réponses:
#!/usr/bin/env
recherchesPATH
pourbash
, etbash
ne sont pas toujours/bin
, en particulier sur les systèmes non-Linux. Par exemple, sur mon système OpenBSD, c'est dans/usr/local/bin
, car il a été installé en tant que package facultatif.Si vous êtes absolument sûr que
bash
c'est/bin
et que vous le serez toujours, il n'y a aucun mal à le mettre directement dans votre shebang - mais je le déconseille car les scripts et les programmes ont tous une vie au-delà de ce que nous pensons initialement.la source
env
emplacement? POSIX ne le force pas./usr/lib/sendmail
(ou, plus récemment,/usr/sbin/sendmail
) disponible pour traiter le courrier, il est dans l'intérêt d'un système de type Unix,/usr/bin/env
car le shebang env est une telle pratique courante. Il s'agit d'une interface standard de facto.env
, mais en quelque sorte de ne pas avoir un emplacement standard (qui peut simplement être un lien logiciel) pourbash
. Sans parler de la raison pour laquelle hashbang n'accepte pas simplement#!bash
, et utilise lePATH
, au lieu de faire exactement la même chose avecenv
. Pas assez confus pour les débutants, je suppose.This mostly works because the path /usr/bin/env is commonly used for the env utility
ici en.wikipedia.org/wiki/Shebang_(Unix) - Nous devons nous confier d'env
être là "probablement" dans tous les systèmes.env
trouvait/bin
, pas dans/usr/bin
( je ne sais pas lequel, probablement SunOS 4). Ces jours-ci, il/usr/bin/env
sera très probablement disponible, simplement en raison de la popularité du#!/usr/bin/env
hack.L'emplacement standard de bash est
/bin
, et je pense que c'est vrai sur tous les systèmes. Cependant, que faire si vous n'aimez pas cette version de bash? Par exemple, je veux utiliser bash 4.2, mais le bash sur mon Mac est à 3.2.5.Je pourrais essayer de réinstaller bash dans
/bin
mais cela peut être une mauvaise idée. Si je mets à jour mon système d'exploitation, il sera remplacé.Cependant, je pouvais installer bash dans
/usr/local/bin/bash
et configurer mon PATH pour:Maintenant, si je précise
bash
, je ne reçois pas l'ancien cruddy/bin/bash
, mais le plus récent et plus brillant à/usr/local/bin
. Agréable!Sauf que mes scripts shell ont ça
!# /bin/bash
shebang. Ainsi, lorsque j'exécute mes scripts shell, j'obtiens cette ancienne et moche version de bash qui n'a même pas de tableaux associatifs.Utiliser
/usr/bin/env bash
utilisera la version de bash trouvée dans mon PATH. Si je configure mon CHEMIN, pour que/usr/local/bin/bash
soit exécuté, c'est le bash que mes scripts utiliseront.Il est rare de voir cela avec bash, mais c'est beaucoup plus courant avec Perl et Python:
/bin
?/usr/bin
?/opt/bin
? Qui sait? L'utilisation#! /usr/bin/env perl
signifiait que je n'avais pas besoin de savoir.Et maintenant pourquoi vous ne devriez pas utiliser
#! /usr/bin/env bash
Lorsque le chemin est codé en dur dans le shebang, je dois courir avec cet interprète. Ainsi,
#! /bin/bash
m'oblige à utiliser la version installée par défaut de bash. Étant donné que les fonctionnalités bash sont très stables (essayez d'exécuter une version 2.x d'un script Python sous Python 3.x), il est très peu probable que mon script BASH particulier ne fonctionne pas, et puisque mon script bash est probablement utilisé par ce système et d'autres systèmes , l'utilisation d'une version non standard de bash peut avoir des effets indésirables. Il est très probable que je veux m'assurer que la version standard stable de bash est utilisée avec mon script shell. Ainsi, je veux probablement coder en dur le chemin dans mon shebang.la source
Pour l'invoquer,
bash
c'est un peu exagéré. Sauf si vous avez plusieursbash
binaires comme le vôtre dans ~ / bin, mais cela signifie également que votre code dépend de $ PATH contenant les bonnes choses.C'est pratique pour des choses comme ça
python
. Il existe des scripts et des environnements wrapper qui mènent à une alternativepython
binaires .Mais rien n'est perdu en utilisant le chemin exact vers le binaire tant que vous êtes sûr que c'est le binaire que vous voulez vraiment.
la source
python
. J'ai perdu le compte du nombre de placespython
peut être trouvé 😀/usr/bin/env
plus utile pour Python, surtout si vous utilisez virtualenv.Il y a beaucoup de systèmes qui n'ont pas Bash
/bin
, FreeBSD et OpenBSD pour n'en nommer que quelques-uns. Si votre script est censé être portable à beaucoup de différents systèmes Unix, vous pouvez utiliser au#!/usr/bin/env bash
lieu de#!/bin/bash
.Notez que cela n'est pas vrai pour
sh
; pour les scripts compatibles Bourne J'utilise exclusivement#!/bin/sh
, puisque je pense à peu près tous les Unix existants ash
en/bin
.la source
/bin
dir, je voissh -> dash
. Lien symbolique avecdash
, révélant la nature Debian d'Ubuntu. Exécutez ces trois chaînes de commande pour vous rendre compte que tout se résume aux préférences individuelles:which bash
puiswhich sh
alorswhich dash
.Je préfère envelopper le programme principal dans un script comme ci-dessous pour vérifier tous les
bash
disponibles sur le système. Mieux vaut avoir plus de contrôle sur la version qu'il utilise.la source
est certainement meilleur car il trouve le chemin exécutable bash à partir de votre variable d'environnement système.
Accédez à votre shell Linux et tapez
Il imprimera toutes vos variables d'environnement.
Accédez à votre script shell et tapez
Il imprimera votre chemin bash (selon la liste des variables d'environnement) que vous devez utiliser pour créer votre chemin de shebang correct dans votre script.
la source