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 a dash
. En su lugar, puede convertirlo en un enlace simbólico bash
. Las versiones actuales de Debian y Ubuntu (y derivados) hacen de esta una opción de instalación de dash. Para cambiarlo, ejecuta
sudo dpkg-reconfigure dash
y 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.
sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh
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 vista sudo ln -sf bash /bin/sh
es que ln -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
:
sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /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).
==
que debería ser=
. Eso, y que las expansiones variables deben ser citadas dos veces.