J'installe un énorme programme, qui a ses ressources sous forme de rpm
fichier. Il est resté sur la ligne de
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
Apparemment, sh
travaillez 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 bash
car le script provient du rpm
package. Je peux extraire et reconditionner le rpm
paquet, 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/sh
comme bash
ou autre chose, qui peut gérer l' [
opérateur?
==
qui devrait être=
. Cela, et que les extensions de variable doivent être entre guillemets.[
n'est pas un opérateur, mais une commande intégrée qui est appeléetest
. L'opérateur inattendu est==
et doit être remplacé par=
car il n'est pas compatible POSIX.$SCITEGICPERLHOME
faut la citer.#!/bin/sh
, ils doivent s'assurer qu'ils n'utilisent que les fonctionnalités du shell POSIX, pas lesbash
extensions. Ce programmeur est très bâclé. Il doit soit corriger son code, soit l'utiliser#!/bin/bash
.Réponses:
Il existe plusieurs programmes qui implémentent le langage de
/bin/sh
. Sur Ubuntu,/bin/sh
est 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/sh
est 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/sh
est un lien symbolique versdash
. Vous pouvez en faire un lien symbolique à labash
place. Les versions actuelles de Debian et Ubuntu (et dérivés) en font une option d'installation de dash. Pour le changer, exécutezet répondez «oui» pour conserver le tiret comme
/bin/sh
ou «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.Gardez un terminal ouvert et vérifiez que vous pouvez toujours exécuter certains
sh
scripts 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 simplesudo ln -sf bash /bin/sh
est qu'illn -sf
n'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,mv
est atomique.)Pour restaurer le tableau de bord en tant que
/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/bin/sh
peuvent utiliser des fonctionnalités spécifiques à bash dans des#!/bin/sh
scripts 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/sh
et à mesure et il n'y a aucune attente que ces scripts fonctionnent sur une autre distribution).la source
/bin/sh
est Bash, c'est un bug soit dans le système (le package avec le script), soit dans le mode-Bashsh
. Comme Stephen le dit, le système permet explicitement de/bin/sh
revenir à Bash, viadpkg-reconfigure
. Il est également mentionné comme une possibilité dans le wiki Ubuntu à ce sujet: wiki.ubuntu.com/DashAsBinSh/bin/sh
c'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/sh
auparavant, 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.debconf
la prochainedash
mise à jour; Certes, cela n'arrivera pas souvent (voire pas du tout dans une version donnée) pour les systèmes exécutant Debian stable.Pour basculer
sh
versbash
(au lieu dedash
, la valeur par défaut), reconfigurerdash
(oui, c'est quelque peu contre-intuitif):Cela vous demandera si vous voulez
dash
être le shell système par défaut; répondez «Non» ( Tabpuis Enter) etbash
deviendra la valeur par défaut ( c'est/bin/sh
-à- dire pointera vers/bin/bash
).la source