Estoy instalando un gran programa, que tiene sus recursos como un rpm
archivo. Se atascó en la línea de
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
Aparentemente, sh
trabaja bash
en Red Hat Linux con esta sintaxis, pero da el error de unexpected operator
en Ubuntu.
No puedo cambiar el script a bash
como el script proviene del rpm
paquete. Puedo extraer y volver a rpm
empaquetar el paquete, pero puede haber muchos de estos scripts.
¿Hay alguna manera de cambiar el valor predeterminado de shell para tratar #!/bin/sh
como bash
o cualquier otra cosa que pueda manejar el [
operador?
==
que debería ser=
. Eso, y que las expansiones variables deben ser citadas dos veces.[
no es un operador, sino un comando incorporado que se llamatest
. El operador inesperado es==
y esto debe reemplazarse=
porque no es compatible con POSIX.$SCITEGICPERLHOME
debería citarse.#!/bin/sh
, deben asegurarse de que solo usen las funciones de shell POSIX, nobash
extensiones. Este programador es muy descuidado. Debería arreglar su código o usarlo#!/bin/bash
.Respuestas:
Existen múltiples programas que implementan el lenguaje de
/bin/sh
. En Ubuntu,/bin/sh
es dash, que está diseñado para ser rápido, para usar una pequeña cantidad de memoria, y no admite mucho más que el mínimo esperado/bin/sh
. En RHEL,/bin/sh
es bash, que es más lento y usa más memoria pero tiene más funciones. Una de estas características es el==
operador de la[
sintaxis condicional. Dash admite[
, que es una característica básica de sh, pero no tiene el==
operador que es una extensión bash (y ksh y zsh).Puede cambiar su sistema para usar bash. En Ubuntu,
/bin/sh
es un enlace simbólico adash
. En su lugar, puede convertirlo en un enlace simbólicobash
. Las versiones actuales de Debian y Ubuntu (y derivados) hacen de esta una opción de instalación de dash. Para cambiarlo, ejecutay responda "sí" para mantener el guión como
/bin/sh
o "no" para cambiar a bash.Puede mantener bash como
/bin/sh
, pero hará que su sistema sea un poco más lento. Incluso es concebible que algún script del sistema sea incompatible con bash, aunque eso es poco probable ya que bash es principalmente un superconjunto de guiones.Para las distribuciones que no tienen una interfaz para elegir entre implementaciones
/bin/sh
, aquí le mostramos cómo cambiar a bash.Mantenga una terminal abierta y verifique que aún pueda ejecutar algunos
sh
scripts después de eso. Si estropea este comando, hará que su sistema sea inutilizable. (Por cierto, la razón por la que utilicé los múltiples comandos anteriores en lugar de la simple vistasudo ln -sf bash /bin/sh
es queln -sf
no es atómica. En el caso que es poco probable que su computadora se bloquee durante esta operación, necesitaría arrancar desde los medios de rescate para restaurarlo. Por el contrario,mv
es atómico).Para restaurar el guión como
/bin/sh
:Tenga en cuenta que si sh está
/bin/bash
predeterminado en su distribución, cambiar a dash puede hacer que los scripts fallen, porque bash tiene muchas más funciones que dash. Las secuencias de comandos de Bash deberían comenzar con#!/bin/bash
, y las secuencias de comandos que comienzan con#!/bin/sh
no deberían usar características específicas de bash, pero las distribuciones que se envían con bash/bin/sh
pueden usar características específicas de bash en#!/bin/sh
secuencias de comandos que son específicas de esa distribución (está bien siempre que no se espere que los usuarios puede cambiar a guión como/bin/sh
y no hay expectativas de que estos scripts funcionen en otra distribución).fuente
/bin/sh
es Bash, es un error en el sistema (el paquete con el script) o en el modo de Bashsh
. Como dice Stephen, el sistema permite explícitamente/bin/sh
volver a Bash a través dedpkg-reconfigure
. También se menciona como una posibilidad en el wiki de Ubuntu sobre este asunto: wiki.ubuntu.com/DashAsBinSh/bin/sh
es bash, es un error. Sin embargo, ocurren errores. Recomiendo mantener el valor predeterminado si no es capaz y no está dispuesto a diagnosticar dichos errores porque otras personas lo han probado por usted. Utilicé dash como/bin/sh
antes tenía soporte oficial en Debian, pero este fue un riesgo que asumí, sabiendo que sería capaz de hacer frente si algo sucedía.debconf
la próxima vez quedash
se actualice; Es cierto que esto no sucederá a menudo (si es que lo hace, en una versión dada) para sistemas que ejecutan Debian estable.Para cambiar
sh
abash
(en lugar deldash
predeterminado), reconfiguredash
(sí, es algo contra-intuitivo):Esto le preguntará si desea
dash
ser el shell predeterminado del sistema; responda "No" ( Tabentonces Enter) ybash
se convertirá en el valor predeterminado ( es decir,/bin/sh
apuntará a/bin/bash
).fuente