10 votes

Bash 3 par défaut surchargeant le shebang /bin/bash avec bash 4 installé par brew

Contexte

Bash 4 installé avec succès en utilisant homebrew et les étapes supplémentaires requises pour faire de bash 4 votre shell par défaut. De nombreux guides sont disponibles sur le net avec une simple recherche sur Google : Exemple de guide de mise à jour de Bash 4 pour Mac

  • Bash 4.x (installé via brew) emplacement : /usr/local/bin/bash
  • Bash 3.2 (OSX par défaut) : /bin/bash

Problème

scripts Je ne peux pas contrôler/modifier le shebang Il n'y a pas d'autre solution que d'effectuer une modification manuelle, car cela affecterait d'autres utilisateurs. À moins que je ne modifie manuellement et que je ne revienne en arrière avant de valider dans le contrôle de source. Une autre option consiste à taper : bash some_script_with_bin_bash_shebang.sh pour forcer l'utilisation du nouveau shell par défaut, bash 4.

Je n'ai jamais eu besoin de le faire que pour les fonctionnalités de Bash 4+, ce qui est très courant aujourd'hui.

Question

Est-ce que quelqu'un a une technique sympa, des solutions de contournement pour aliaser un chemin shebang bash comme ceci : #!/bin/bash à l'interpréteur de commandes bash 4, plus récent, à l'adresse /usr/local/bin/bash ?

Sans évidemment modifier le fichier ! ^_^ (par exemple en ajoutant #!/usr/bin/env bash )

7voto

grg Points 181593

C'est la principale raison qui justifie aujourd'hui l'utilisation d'un système différent :

#!/usr/bin/env bash

Cela utilisera le premier bash dans le PATH, qui sera probablement la dernière version. Puisque /bin est dans le chemin standard ( getconf PATH ), ce qui permet à ceux qui n'ont pas de bash personnalisé de s'en remettre gracieusement.

0voto

Tom Tyler Points 1

Ma solution consiste simplement à appeler l'interprète directement.

Ainsi, par exemple, au lieu d'appeler quelque chose comme :

./foo.sh

Je l'appelle plutôt avec :

bash ./foo.sh

La première forme (appeler './foo.sh') utilise l'interpréteur défini dans la ligne shebang, ce qui vous donne (sans le vouloir) bash 3.x sur OSX (au moins à partir d'OSX Big Sur). Cependant, la seconde forme ignore la ligne shebang, appelant la version de bash que vous avez dans votre PATH. Si votre PATH contient '/usr/local/bin' (ou l'endroit où vous l'avez installé avec brew) avant '/bin', vous exécuterez votre script avec la version de bash désirée sans tenir compte de ce qui se trouve sur la ligne shebang. Ainsi, vous pouvez exécuter votre script avec des fonctionnalités nécessitant bash 4.x+ (comme les tableaux associatifs).

Cela permet de ne pas avoir à changer le script du tout, tout en continuant à exécuter avec la version de bash que vous voulez. A ce jour, vous pouvez obtenir bash 5.x avec brew, alors qu'OSX 11.2 "Big Sur" est toujours livré avec /bin/bash v3.x.

Cette méthodologie est la plus adaptée lorsque vous développez pour plates-formes où '/bin/bash' est une version fiable que vous voulez, mais où vous développez des systèmes de gestion de l'information. sur OSX où '/bin/bash' est 3.x. De cette façon, vous pouvez développer et tester avec la version cible prévue de bash sans modifier la ligne shebang du script d'une manière qui le rendrait moins fiable sur les plates-formes cibles. Pour bash en particulier, je préfère également ne pas utiliser l'astuce #!/usr/bin/env, car cela ajoute de la complexité pour les utilisateurs et peut ajouter de la complexité au support.

Je comprends le point soulevé à propos de la source par rapport au déploiement, et qu'il n'y a pas d'exigence absolue de ne pas autoriser les changements de déploiement aux scripts. Cependant, le fait d'être "autorisé" à modifier les lignes de "shebang" dans le contrôle de version et d'avoir ainsi des changements nécessaires dans les processus de déploiement peut être une grosse affaire, et peut ne pas être quelque chose sur lequel vous avez un quelconque contrôle. Avoir des scripts qui nécessitent un processus de déploiement qui modifie la somme de contrôle du code original réduit l'un des principaux avantages de la "simplicité" de l'utilisation des scripts de l'interpréteur de commandes bash. Si les scripts sont déployés dans le cadre d'un produit plus vaste capable de garantir que les étapes d'installation complexes sont gérées de manière fiable, je n'y verrais pas d'objection. Mais si les scripts sont le produit, il y a beaucoup d'avantages à limiter la complexité du déploiement à "untar à partir d'une archive" (avec une commande prescrite qui gère le chmod +x et l'emplacement de placement/déploiement).

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X