Es sabido que el shell por defecto en macOS es el Z shell desde «Catalina«. Hay quienes lo elogian pero, como alguna vez escribí, no termina por convencerme. BASH puede ser viejo, pero es estable y bien conocido por muchos. Shells más «modernos» pueden ser llamativos o dar de qué hablar pero aún deben madurar y ser adoptados (aceptados quizás ya estén). Para quienes debemos trabajar en otros equipos más allá del que tenemos en casa (equipo remoto o en un nube), encontrar un mismo shell en esos otros equipos permiten dar continuidad a cualquier trabajo que uno esté haciendo.
Hablando de la «continuidad» creo que ese es el punto central. No se trata de sólo tener algo que igual funcione en mi equipo, donde desarrollaré algo que luego moveré a otro u otros equipo o entornos en los que espero funcione de la misma manera; se trata de una continuidad filosófica también. Me refiero a una idea o concepto que se ha venido respetando.
Po ejemplo, contrariamente a los estándares de POSIX, en el zsh recientemente me encontré con algo que me llevó a cometer un error que deshacerlo implicó (más fácil) borrar lo que se tenía y reinstalar de un respaldo. Ocurre que al tratar de borrar una serie de directorios o contenido en ellos, el comando empleado no se ejecutó, cuando lo usual es que hubiera sido, al menos, parcialmente ejecutado. Por ejemplo, en BASH uno espera que un comando como éste
$ rm -rf dir1 dir2 dir3/archivos* dir4 dir5
de encontrar un error en su ejecución se ejecute parcialmente. Digamos que en el ejemplo, la acción de borrado en dir3
tropezara con un problema de permisos, dir1
y dir2
deberían ser borrados al menos. Se esperaría que dir4
y dir5
no hubieran sido tocados.
Pero, ni siquiera algo similar ocurrió al tratar de ejecutar esta instrucción en zsh, que reportó no encontrar coincidencias con el patrón indicado para dir3
(lo cual no debería ser problema y poder ejecutarse el comando hasta el final). Por defecto esto pasaría en BASH. Para el aso de zsh no es así. Por defecto, se encuentra prendida una bandera para reportar como falla el no encontrar coincidencias en la aplicación de una expresión regular (globbing), de uno de estos patrones. Para evitar esto es necesario apagar la bandera
$ setopt -o nonomatch
Para regresar el comportamiento por defecto basta
$ setopt +o nonomatch