web-dev-qa-db-fra.com

Comment utiliser Bash pour sh dans Ubuntu

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

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

Apparemment, sh fonctionne pour bash dans Red Hat Linux avec cette syntaxe, mais cela donne l'erreur de unexpected operator dans Ubuntu.

Je ne peux pas changer le script en bash car le script provient du package rpm. Je peux extraire et reconditionner le package rpm, mais il peut y avoir beaucoup de ces scripts.

Existe-t-il un moyen de modifier la valeur par défaut de Shell pour traiter #!/bin/sh as bash ou toute autre chose, qui peut gérer le [ opérateur?

14
Googlebot

Il existe plusieurs programmes qui implémentent le langage de /bin/sh. Sur Ubuntu, /bin/sh Est un tiret, 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/sh Est bash, ce 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 == Pour la syntaxe conditionnelle [. Dash prend en charge [, Qui est une fonctionnalité de base de sh, 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/sh Est un lien symbolique vers dash. Vous pouvez en faire un lien symbolique vers bash à la place. 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/sh ou "non" pour passer en bash.

Vous pouvez garder bash sous /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 scripts sh 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 le simple Sudo ln -sf bash /bin/sh Est que ln -sf N'est pas atomique. Dans le cas, certes improbable, que votre ordinateur s'est écrasé pendant cette opération, vous aurait besoin de démarrer à partir d'un support de secours pour le restaurer. En revanche, mv est 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/bash Par 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/sh Ne doivent pas utiliser de fonctionnalités spécifiques à bash, mais les distributions livrées avec bash sous la forme /bin/sh Peuvent utiliser des fonctionnalités spécifiques à bash dans #!/bin/sh Scripts spécifiques à cette distribution (c'est correct tant qu'il n'y a aucune attente que les utilisateurs puissent basculer vers dash comme /bin/sh Et il n'y a aucune attente que ces scripts fonctionnent sur une autre distribution).

Pour passer de sh à bash (au lieu de dash, la valeur par défaut), reconfigurez dash (oui, c'est quelque peu contre-intuitif):

Sudo dpkg-reconfigure dash

Cela vous demandera si vous voulez que dash soit le shell système par défaut; répondez "non" (Tab puis Enter) et bash deviendra la valeur par défaut (c'est-à-dire/bin/sh pointera sur /bin/bash).

36
Stephen Kitt