Comment utiliser Bash pour sh dans Ubuntu


13

J'installe un énorme programme, qui a ses ressources sous forme de rpmfichier. Il est resté sur la ligne de

#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]

Apparemment, shtravaillez bashdans Red Hat Linux avec cette syntaxe, mais cela donne l'erreur de unexpected operatordans Ubuntu.

Je ne peux pas changer le script bashcar le script provient du rpmpackage. Je peux extraire et reconditionner le rpmpaquet, mais il pourrait y avoir beaucoup de ces scripts.

Existe-t-il un moyen de modifier la valeur par défaut du shell pour traiter #!/bin/shcomme bashou autre chose, qui peut gérer l' [opérateur?


5
La seule chose qui cloche, c'est ce ==qui devrait être =. Cela, et que les extensions de variable doivent être entre guillemets.
Kusalananda

4
[n'est pas un opérateur, mais une commande intégrée qui est appelée test. L'opérateur inattendu est ==et doit être remplacé par =car il n'est pas compatible POSIX.
schily

La deuxième seule chose qui ne va pas, c'est qu'il $SCITEGICPERLHOMEfaut la citer.
l0b0

12
Vous devez vous plaindre auprès de l'auteur du programme. S'ils utilisent #!/bin/sh, ils doivent s'assurer qu'ils n'utilisent que les fonctionnalités du shell POSIX, pas les bashextensions. Ce programmeur est très bâclé. Il doit soit corriger son code, soit l'utiliser #!/bin/bash.
Barmar

Pour ceux qui s'interrogent sur d'autres problèmes similaires, voici une liste de " bashismes ". Voir aussi cette question .
Captain Man

Réponses:


21

Il existe plusieurs programmes qui implémentent le langage de /bin/sh. Sur Ubuntu, /bin/shest dash, qui est conçu pour être rapide, pour utiliser une petite quantité de mémoire, et ne prend pas en charge beaucoup plus que le minimum attendu de /bin/sh. Sur RHEL, /bin/shest bash, qui est plus lent et utilise plus de mémoire mais a plus de fonctionnalités. L'une de ces fonctionnalités est l' ==opérateur de la [syntaxe conditionnelle. Dash prend en charge [, qui est une fonctionnalité sh de base, mais il n'a pas l' ==opérateur qui est une extension bash (et ksh et zsh).

Vous pouvez passer votre système en utilisant bash. Sur Ubuntu, /bin/shest un lien symbolique vers dash. Vous pouvez en faire un lien symbolique à la bashplace. Les versions actuelles de Debian et Ubuntu (et dérivés) en font une option d'installation de dash. Pour le changer, exécutez

sudo dpkg-reconfigure dash

et répondez «oui» pour conserver le tiret comme /bin/shou «non» pour passer à bash.

Vous pouvez garder bash as /bin/sh, mais cela rendra votre système un peu plus lent. Il est même concevable que certains scripts système soient incompatibles avec bash, bien que cela soit peu probable car bash est principalement un surensemble de tirets.


Pour les distributions qui n'ont pas d'interface pour choisir entre les implémentations de /bin/sh, voici comment passer à bash.

sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh

Gardez un terminal ouvert et vérifiez que vous pouvez toujours exécuter certains shscripts après cela. Si vous gâchez cette commande, cela rendra votre système inutilisable. (Soit dit en passant, la raison pour laquelle j'ai utilisé les multiples commandes ci-dessus plutôt que l'aspect simple sudo ln -sf bash /bin/shest qu'il ln -sfn'est pas atomique. Dans le cas, il est peu probable, que votre ordinateur s'est écrasé pendant cette opération, vous devez démarrer à partir d'un support de secours pour le restaurer. En revanche, mvest atomique.)

Pour restaurer le tableau de bord en tant que /bin/sh:

sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /bin/sh

Notez que si sh est /bin/bashpar défaut sur votre distribution, le passage à dash peut entraîner l'échec des scripts, car bash a beaucoup plus de fonctionnalités que dash. Les scripts Bash doivent commencer par #!/bin/bash, et les scripts commençant par #!/bin/shne doivent pas utiliser de fonctionnalités spécifiques à bash, mais les distributions livrées avec bash /bin/shpeuvent utiliser des fonctionnalités spécifiques à bash dans des #!/bin/shscripts spécifiques à cette distribution (c'est correct tant qu'il n'y a aucune attente que les utilisateurs peut passer au tiret au fur /bin/shet à mesure et il n'y a aucune attente que ces scripts fonctionnent sur une autre distribution).


À mon avis, pas si humble, si un script échoue quand /bin/shest Bash, c'est un bug soit dans le système (le package avec le script), soit dans le mode-Bash sh. Comme Stephen le dit, le système permet explicitement de /bin/shrevenir à Bash, via dpkg-reconfigure. Il est également mentionné comme une possibilité dans le wiki Ubuntu à ce sujet: wiki.ubuntu.com/DashAsBinSh
ilkkachu

5
@ilkkachu Oui, si un script échoue si /bin/shc'est bash, c'est un bug. Cependant, des bugs se produisent. Je recommande de s'en tenir à la valeur par défaut si vous n'êtes pas capable et disposé à diagnostiquer de tels bugs car d'autres personnes l'ont testé pour vous. J'ai utilisé dash comme /bin/shauparavant, il était officiellement supporté sur Debian, mais c'était un risque que je prenais, sachant que je serais capable de faire face si quelque chose se passait.
Gilles 'SO- arrête d'être méchant'

Notez que les liens symboliques remplacés manuellement seront restaurés dans la configuration stockée lors de debconfla prochaine dashmise à jour; Certes, cela n'arrivera pas souvent (voire pas du tout dans une version donnée) pour les systèmes exécutant Debian stable.
Stephen Kitt

36

Pour basculer shvers bash(au lieu de dash, la valeur par défaut), reconfigurer dash(oui, c'est quelque peu contre-intuitif):

sudo dpkg-reconfigure dash

Cela vous demandera si vous voulez dashêtre le shell système par défaut; répondez «Non» ( Tabpuis Enter) et bashdeviendra la valeur par défaut ( c'est /bin/sh -à- dire pointera vers /bin/bash).


1
Votre solution est en effet la plus raisonnable, mais j'ai accepté une autre réponse en raison de descriptions détaillées clarifiant le problème. Désolé pour le dérangement.
Googlebot

@Googlebot n'a pas besoin de s'excuser, le choix de la réponse acceptée est le privilège du demandeur. Et j'en ai obtenu un badge en or ;-).
Stephen Kitt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.