¿Cuáles son las diferencias prácticas entre Bash y Zsh?

Con la noticia de que Catalina usará de forma predeterminada Zsh en lugar de Bash , estoy encontrando muchos resultados que me informan sobre el cambio y que puede causar problemas con los scripts de shell, pero no estoy lo suficientemente familiarizado con Zsh para saber cuáles son esos problemas. puede ser.

Mis scripts de shell realmente no son tan complicados, pero solo he usado Bash en macOS y Linux: cero experiencia con Zsh. ¿Alguien puede proporcionar una comparación práctica simple o obstáculos específicos que necesitaré saber para poder comenzar a trabajar para estar listo para el nuevo caparazón cuando se lance Catalina?

Todo este alboroto que has estado leyendo es mucho que hacer por nada. El sistema operativo asigna un shell "predeterminado" al crear nuevos usuarios, sin más motivo. Bash no va a desaparecer, y puede usarlo como su shell o cualquiera de los otros shells que se ofrecen actualmente.
Hablando como alguien que usó ambos y aterrizó en bash, lo único que me hizo realmente, profundamente infeliz con zsh fue su decisión de infringir el cumplimiento de POSIX cuando el estándar canonicaliza las decisiones de diseño ciertamente malas de manera que sea fácil ser descuidado. corrección al intentar escribir scripts que necesitaban ser compatibles con otros shells estrictamente POSIX-superset. Desafortunadamente, esa "única cosa" puede ser bastante grande. Aún así, ksh93 no va a desaparecer, y cualquiera que se tome en serio bash no usaría la antigua versión 3.x que Apple envía de todos modos.
Como seguimiento: instalé Catalina ayer, cambié a zsh, importé bash_history y copié algunos de mis alias preferidos de bash_profile, nada parece haberse roto. Aprecio toda la información proporcionada por todos aquí y espero que también ayude a otros.
@CharlesDuffy: Buen comentario. WRT siendo "serio" y usando bash version 3.2.57(1): ¿Sabes si Apple lo usa bashpara algo "importante" en el sistema?
Si usa XQuartz para ejecutar cualquier aplicación X11 pero tiene problemas para ejecutarlas en zsh, es posible que desee consultar esta discusión de Apple sobre cómo ejecutarlas en bash .

Respuestas (4)

Primero, algunas cosas importantes:

  1. Bash no va a desaparecer . Si ya está usando bash, nada cambiará para usted. Todo lo que cambia es que zsh será el shell de inicio de sesión predeterminado para las cuentas nuevas , e incluso entonces, puede seleccionar bash en su lugar.
  2. Los scripts no se ven afectados . Lo que cambia es el shell para uso interactivo, es decir, el shell en terminales (y también algunas otras cosas que usan el shell de inicio de sesión, como crontabs). Si tiene un script en un archivo con permisos de ejecución, comenzando con una línea shebang como #!/bin/basho #!/bin/sho #!/usr/bin/env bash, seguirá funcionando exactamente como antes.
  3. La sintaxis de Zsh no es completamente compatible con bash, pero está cerca. Una gran cantidad de código seguirá funcionando, por ejemplo, alias y funciones típicas. Las principales diferencias están en las funciones de configuración interactiva.

Ahora, suponiendo que esté considerando cambiar a zsh, lo cual ha sido una posibilidad durante años, estas son las principales diferencias que encontrará. ¡Esta no es una lista exhaustiva!

Principales diferencias para el uso interactivo

Archivos de configuración : bash lee (principalmente) .bashrcen shells interactivos sin inicio de sesión (pero macOS inicia un shell de inicio de sesión en terminales de forma predeterminada), .profileo .bash_profileen shells de inicio de sesión, y .inputrc. Zsh lee (principalmente) .zshrc(en todos los shells interactivos) y .zprofile(en los shells de inicio de sesión). Esto significa que no se aplicará ninguna de sus personalizaciones de bash: deberá transferirlas. No puede simplemente copiar los archivos porque muchas cosas necesitarán ajustes.

Las combinaciones de teclas usan una sintaxis completamente diferente. Bash usa .inputrcy el bindincorporado para vincular claves a comandos de línea de lectura . Zsh usa el bindkeyincorporado para vincular claves a widgets zle . La mayoría de los comandos readline tienen un equivalente zsh, pero no siempre es una equivalencia perfecta.

Hablando de combinaciones de teclas, si usa Vi(m) como su editor en la terminal pero no como su modo de línea de comando en el shell, notará que zsh se establece de manera predeterminada en el modo de edición vi (es decir, con modos de comando e inserción) si EDITORo VISUALes establecido en vio vim. bindkey -ecambia al modo emacs (es decir, donde siempre puede escribir directamente).

Aviso : bash establece el aviso (principalmente) desde PS1el cual contiene escapes de barra invertida . Zsh establece el indicador principalmente desde PS1el que contiene escapes porcentuales . Aunque los conceptos son similares, los códigos de escape son completamente diferentes. La funcionalidad de bash PROMPT_COMMANDestá disponible en zsh a través de las funciones precmdy gancho . Zsh tiene más mecanismos convenientes para crear avisos sofisticados, incluido un mecanismo de tema de aviso .preexec

Los mecanismos básicos del historial de la línea de comandosUp (navegación con / Down, búsqueda con Ctrl+ R, expansión del historial con !!y amigos, recuperación del último argumento con Alt+ .o $_) funcionan de la misma manera, pero hay muchas diferencias en los detalles, demasiadas para enumerarlas aquí. . Puede copiar su .bash_historya .zsh_historysi no ha cambiado una opción de shell que cambia el formato del archivo.

Finalización : ambos shells tienen por defecto un modo de finalización básico que en su mayoría completa comandos y nombres de archivos, y cambia a un modo sofisticado al incluir bash_completionen bash o ejecutar compiniten zsh. Encontrará algunos comandos que bash maneja mejor y otros que zsh maneja mejor. Zsh suele ser más preciso, pero a veces se da por vencido cuando bash hace algo que no es correcto pero que es sensato. Para especificar posibles finalizaciones para un comando, zsh tiene tres mecanismos:

Muchas de shoptlas configuraciones de bash tienen su correspondiente setopten zsh.

Zsh no se trata #como un comienzo de comentario en la línea de comandos de forma predeterminada, solo en scripts (incluidos .zshrcy similares). Para habilitar los comentarios interactivos, ejecute setopt interactive_comments.

Principales diferencias para el scripting

(y para usuarios avanzados en la línea de comandos, por supuesto)

En bash, $footoma el valor de foo, lo divide en espacios en blanco y, para cada parte separada por espacios en blanco, si contiene caracteres comodín y coincide con un archivo existente, reemplaza el patrón por la lista de coincidencias. Para obtener el valor de foo, necesita "$foo". Lo mismo se aplica a la sustitución de comandos $(foo). En zsh, $fooes el valor de fooy $(foo)es la salida de foomenos sus saltos de línea finales, con dos excepciones. Si una palabra queda vacía debido a la expansión de variables vacías sin comillas, se elimina (por ejemplo, a=; b=; printf "%s\n" one "$a$b" three $a$b fiveimprime one, una línea vacía, three, five). El resultado de una sustitución de comando sin comillas se divide en espacios en blanco, pero las piezas no se someten a la coincidencia de comodines.

Las matrices Bash están indexadas de 0 a (longitud-1). Las matrices Zsh están indexadas de 1 a longitud. Puede hacer que la indexación 0 sea la predeterminada con setopt ksh_arrays. Zsh requiere menos llaves (a menos que ksh_arraysesté habilitado). Por ejemplo, supongamos a=(first second third "" last).

Funcionalidad sintaxis bash Sintaxis idiomática de zsh Expansión
primer elemento ${a[0]} $a[1] first
segundo elemento ${a[1]} $a[2] second
último elemento ${a[${#a[@]}-1]} $a[-1] last
Longitud ${#a[@]} $#a 5
todos los elementos "${a[@]}" "${a[@]}"o"${(@)a}" first second third(palabra vacía)last
Todos los elementos no vacíos $a first second third last

Bash tiene patrones de comodines adicionales , como @(foo|bar)to match fooo bar, que solo están habilitados con shopt -s extglob. En zsh, puede habilitar estos patrones con setopt ksh_glob, pero también hay una sintaxis nativa más simple de escribir, como (foo|bar), algunas de las cuales requieren setopt extended_glob(coloque eso en su .zshrc, y está activado de manera predeterminada en las funciones de finalización). Zsh tiene **/para el recorrido recursivo de directorios (al igual que el bash moderno pero no el bash 3.2 que se envía con macOS).

En bash, por defecto, si un patrón comodín no coincide con ningún archivo, se deja sin cambios. En zsh, de forma predeterminada, obtendrá un error, que suele ser la configuración más segura. Si desea pasar un parámetro comodín a un comando, use comillas. Puede cambiar al comportamiento bash con setopt no_nomatch. Puede hacer que los patrones comodín que no coincidan se expandan a una lista vacía en su lugar con setopt null_glob.

En bash, el lado derecho de una canalización se ejecuta en una subcapa. En zsh, se ejecuta en el shell principal, por lo que puede escribir cosas como somecommand | read output.

Algunas buenas características de zsh

Aquí hay algunas características agradables de zsh que bash no tiene (al menos no sin un poco de esfuerzo). Una vez más, esta es solo una selección de las que considero más útiles.

Los calificadores globales permiten hacer coincidir archivos en función de los metadatos, como su marca de tiempo, su tamaño, etc. También permiten ajustar la salida. La sintaxis es bastante críptica, pero es extremadamente conveniente. Aquí están algunos ejemplos:

  • foo*(.): solo coincidencia de archivos regulares foo*y enlaces simbólicos a archivos regulares, no directorios y otros archivos especiales.
  • foo*(*.): solo archivos ejecutables regulares coincidentes foo*.
  • foo*(-.): solo coincidencia de archivos regulares foo*, no enlaces simbólicos y otros archivos especiales.
  • foo*(-@): solo coincidencia de enlaces simbólicos colgantes foo*.
  • foo*(om): los archivos coincidentes foo*, ordenados por última fecha de modificación, los más recientes primero. Tenga en cuenta que si pasa esto a ls, hará su propia clasificación. Esto es especialmente útil en…
  • foo*(om[1,10]): los 10 archivos más recientes coincidentes foo*, el más reciente primero.
  • foo*(Lm+1): archivos coincidentes foo*cuyo tamaño es de al menos 1 MB.
  • foo*(N): igual que foo*, pero si esto no coincide con ningún archivo, genera una lista vacía independientemente de la configuración de la null_globopción (ver arriba).
  • *(D): coincide con todos los archivos, incluidos los archivos de puntos (excepto .y ..).
  • foo/bar/*(:t)(usando un modificador de historial ): los archivos en foo/bar, pero solo con el nombre base del archivo. Por ejemplo, si hay un foo/bar/qux.txt, se expande como qux.txt.
  • foo/bar/*(.:r): tome los archivos normales foo/bary elimine la extensión. Por ejemplo, foo/bar/qux.txtse expande como foo/bar/qux.
  • foo*.odt(e\''REPLY=$REPLY:r.pdf'\'): toma la lista de archivos que coinciden foo*.odty reemplaza .odtpor .pdf(independientemente de si el archivo PDF existe).

Aquí hay algunos patrones de comodines específicos de zsh útiles .

  • foo*.txt~foobar*: todos .txtlos archivos cuyo nombre comienza con foopero no foobar.
  • image<->.jpg(n): todos .jpglos archivos cuyo nombre base va imageseguido de un número, por ejemplo, image3.jpgy image22.jpgpero no image-backup.jpg. El calificador glob (n)hace que los archivos se enumeren en orden numérico, es decir, image9.jpgviene antes image10.jpg(puede hacer que esto sea el valor predeterminado incluso sin -n) setopt numeric_glob_sort.

Para renombrar archivos en masa , zsh proporciona una herramienta muy conveniente: la zmvfunción . Sugerido para su .zshrc:

autoload zmv
alias zcp='zmv -C' zln='zmv -L'

Ejemplo:

zmv '(*).jpeg' '$1.jpg'
zmv '(*)-backup.(*)' 'backups/$1.$2'

Bash tiene algunas formas de aplicar transformaciones al tomar el valor de una variable . Zsh tiene algo de lo mismo y muchos más .

Zsh tiene una serie de pequeñas características convenientes para cambiar de directorio . Actívelo setopt auto_cdpara cambiar a un directorio cuando escriba su nombre sin tener que escribir cd(bash también tiene esto hoy en día). Puede usar el formulario de dos argumentos paracd cambiar a un directorio cuyo nombre esté cerca del directorio actual. Por ejemplo, si estás dentro /some/where/foo-old/deeply/nested/insidey quieres ir a /some/where/foo-new/deeply/nested/inside, simplemente escribe cd old new.

Para asignar un valor a una variable, por supuesto escribe VARIABLE=VALUE. Para editar el valor de una variable de forma interactiva, simplemente ejecute vared VARIABLE.

Consejos finales

Zsh viene con una interfaz de configuración que admite algunas de las configuraciones más comunes, incluidas recetas enlatadas para cosas como la finalización que no distingue entre mayúsculas y minúsculas. Para (volver a) ejecutar esta interfaz (la primera línea no es necesaria si está utilizando un archivo de configuración que fue editado por zsh-newuser-install):

autoload -U zsh-newuser-install
zsh-newuser-install

Listo para usar, sin ningún archivo de configuración, muchas de las características útiles de zsh están deshabilitadas para compatibilidad con versiones anteriores de 1990. zsh-newuser-installsugiere algunas funciones recomendadas para activar.

Hay muchos marcos de configuración de zsh en la web (muchos de ellos están en Github ). Pueden ser una forma conveniente de comenzar con algunas características poderosas. La otra cara de la moneda es que a menudo te obligan a hacer las cosas como lo hace el autor, por lo que a veces te impiden hacer las cosas como quieres. Usélos bajo su propio riesgo.

El manual de zsh tiene mucha información, pero a menudo está escrito de una manera concisa y difícil de seguir, y tiene pocos ejemplos. No dude en buscar explicaciones y ejemplos en línea: si solo usa la parte de zsh que es fácil de entender en el manual, se lo perderá. Dos buenos recursos son la lista de correo zsh-users y Unix Stack Exchange . Se puede encontrar una amplia colección de artículos sobre cómo cambiar a zsh en Mac en scriptingosx.com y se puede encontrar un script de Ruby útil para llevar su historial de comandos con usted en Github.

Ahora me pregunto si el increíble ctrl-o funciona en zsh. Por supuesto, tampoco funciona en Mac OS en bash, por lo que no es realmente relevante para esta respuesta o sitio. No pude encontrar ninguna información sobre ctrl-o en zsh en una búsqueda rápida en línea, pero, de nuevo, la información sobre ctrl-o en bash también es universalmente inexacta...
@Jasper No sabía que bash tenía esto. Siguiendo la descripción, Co hace lo mismo en zsh con los enlaces de teclas predeterminados.
Me alegró ver que incluiste la sección "Algunas buenas funciones de zsh", y la leí con ansiedad para tratar de entender por qué Apple podría haber tomado la decisión de cambiar el extremadamente común Bash por el mucho menos popular Zsh. No encontré nada ni remotamente convincente allí para justificar el cambio. Obviamente, no es una lista exhaustiva, pero ¿omitiste las características principales de Zsh porque se supone que son obvias? ¿Que me estoy perdiendo aqui?
@CodyGray No lo sé y Apple no tiene la costumbre de justificarse. Puede haber tenido algo que ver con el hecho de que si la situación se hubiera invertido, no habría una sección de "características bonitas de bash". O puede deberse a que el último bash que no es GPLv3 se está volviendo muy antiguo , mientras que zsh tiene una licencia más liberal.
Entendí que la licencia era esencialmente la única razón. También es por eso que bash en macOS sigue siendo v3. Se dice en la calle que bash no se actualizará y se espera que se elimine, a menos que el usuario final lo instale a través de brew o etc. Mi plan era cambiar a zsh más temprano que tarde para macOS, pero apegarme a bash en Debian por el momento.
¿Qué pasa con los scripts no interactivos que no usan Terminal (como Automator o trabajos del sistema)? (Hmm, supongo que solo usan ir por el #!y no se ven afectados por el shell de inicio de sesión predeterminado)
@wisbucky Los scripts no se ven afectados. ¿Por qué los trabajos de Automator o del sistema serían una excepción?
Respuesta imparcial e informativa: se dedicó mucho tiempo y esfuerzo. Además, ¡excelente alimento para el pensamiento ! Después de leerlo, me sorprende la idea de que me quedaré con bash, pero obtendré una versión actual MacPortspara ejecutar junto con la versión 3.2 bashque proporciona Apple. Para mí, siento que zshtiene muchas características excelentes que probablemente nunca usaré ... ¡como la costosa cámara que compré recientemente!
¿ Cuál es el significado de one[1]? No hay oneuna matriz definida.
@Isaac Es el primer elemento de la matriz a. En bash, $asiempre se expande al primer elemento de la matriz, incluso cuando va seguido de algo que parece un subíndice de matriz.
Entonces, quiere decir que en bash a=(one two); echo $a[1] se imprimirá one[1](Eso es lo que escribió allí en la respuesta), en cambio, en zsh se imprimirá solo one. Realmente me tomó mucho releer para entender ese significado. El cambio de shell cada pocas palabras hace que la declaración sea difícil de leer en mi humilde opinión. ¿Podría expresarse de una manera más simple y menos enrevesada?
@Jasper Use "stty descartar undef" para que ctrl-o funcione en Mac.

Cambie su caparazón ahora y pruebe, no es necesario esperar.

chsh -s /bin/zsh

Además, estimaría que el 95 % de los usuarios de macOS no utilizan una línea de comandos y, de los que sí lo hacen, otro 95 % no tendrá que cambiar nada significativo o en absoluto. (Apuesto a que es más como el 10% del 1% que sabe que los shells existen necesitan hacer algo más que portar un par de líneas en sus archivos .dot)

Su indicador cambiará y si cambió su indicador en bash, la forma de cambiarlo zshno es más difícil ni menos documentada que bash.

Los proyectiles más nuevos nunca podrían despegar si rompieran elementos importantes o causaran un período de adaptación doloroso. Si quiere un cambio más fundamental y realmente quiere un caparazón, necesita pensar y requiere entrenamiento e intención de adoptar: pruebe con pescado .

Estoy en conflicto con fish. Lo uso desde hace dos años, pero la incompatibilidad de algunos one-lines de copiar/pegar es agotador. Por otro lado es un shell muy práctico (las sugerencias automáticas sin <kbd>Tab</kbd> son excelentes)
Quería amar a los peces, todavía quiero amar a los peces, pero tengo demasiadas construcciones de caparazones de una década kshpara dejar realmente ese redil. Con mucho gusto dejaré bash atrás y aceptaré zsh por completo ahora, personalmente.
Estoy completamente decepcionado con el pescado. En realidad, es solo otro shell similar a Unix con un poco menos de cruft. (Después de todo, literalmente dice "Finalmente, un shell de línea de comandos para los años 90" en la página de inicio). El único shell nuevo que he visto en los últimos años que realmente trajo algo nuevo a la mesa (principal) fue PowerShell, que desafortunadamente estuvo confinado a Windows por demasiado tiempo y todavía está confinado a .NET. Todavía no hay mucho nuevo en PowerShell que no se haya hecho ya, por ejemplo, en DCL o JCL, pero se ha hecho de una manera (algo) de buen gusto.
@bmike ¿Por qué no solo usar ksh, entonces? Apple envía la versión más actual. Yo mismo, pateé bash hace mucho tiempo y no veo ninguna razón para comenzar a usar zsh ahora.
Sin embargo, esta respuesta no describe las diferencias entre bash y zsh ... y no estoy muy seguro de por qué especificar que "el 95% de los usuarios de macOS no usan la línea de comando" es relevante para una pregunta de un usuario que obviamente usa bash.
fishno es nada. Si realmente quieres una experiencia de shell única, usa tclsh.
Antes de cambiar imprudentemente, uno debe considerar cambiar las preferencias y el historial. Sin dicha advertencia o instrucciones, su recomendación está incompleta y puede ocasionar dificultades inesperadas.
Las instrucciones sobre cómo mover la configuración y el historial se pueden encontrar aquí scriptingosx.com/2019/06/…
@mico Ese es un recurso increíble. Eso haría una gran edición a la publicación.
gracias @bmike. Me armé de valor y edité la impresionante respuesta principal.
@Mavrik Eche un vistazo al blog estupendamente asombroso de Armin Briegel y al libro aún mejor sobre las diferencias. Dado que el tratamiento adecuado del tema requiere decenas de miles de palabras (en mi opinión), opté por centrarme en la facilidad para cambiar y probar las aguas. Después de todo, la respuesta real va a depender en gran medida de cada individuo y de lo que trajeron a bash específicamente.
Gran respuesta; es práctico y cómodo, realmente lo es. :) Pero para mí, hay 2 cosas: 1) La capitalización de mercado de Apple es de más de $ 1 billón de dólares . 2) Me siento "estafado" cuando una empresa de $ 1 billón envía software de 15 años con una nueva computadora de $ 4K que venden. Amo mi Mac, no voy a volver, pero... este #SoftwareAntiguo no es algo bueno.
@Seamus Puede que te sorprenda lo pequeño que es el equipo que trabaja en esto. Apple intentó hacer equipos más grandes y nos trajo peores resultados. No mire el porcentaje de ingresos que genera Mac, mi sospecha es que tenemos más ingenieros de Mac de los que permitirían los números según el historial.
@Seamus Hicieron ese billón vendiendo teléfonos y tomando atajos, no vendiendo Mac. Las mejores personas que Apple tiene trabajan en iOS. Somos osos polares en un Ártico que se calienta y el Mac es nuestro hielo. Muy pronto estaremos nadando, y poco después nos deslizaremos bajo las olas, sin estridencias, porque las personas que ingresaron al ecosistema a través de iOS no se dan cuenta de lo bueno que solía ser la Mac, y por eso no llorarán la muerte de su relevancia como plataforma.
@chiggsy: Puede que tengas razón. Supongo que el tiempo dirá. Mientras tanto, instalé MacPorts y creo que es excelente, y estoy trabajando para el arranque dual de macOS/Linux - casi allí :) Vale la pena guardar el hardware; el software - meh...

Mis scripts de shell realmente no son tan complicados

¿Sus scripts de shell tienen líneas shebang (comienza con #! /bin/basho similar)? De lo contrario, es posible que sin querer haya estado usando una función de bash, donde ejecuta scripts sin un shebang usando bash. Otros shells, como dash o zsh, lo dejan en manos del sistema operativo, que normalmente lo usaría /bin/shen su lugar. /bin/shen macOS es, y probablemente seguirá siendo, una copia de /bin/bash, pero ejecutar bash con el nombre shhace que tenga un comportamiento diferente. Los detalles son el manual de Bash, 6.11 Modo Bash POSIX . Algunos puntos:

  1. Bash se asegura de que la POSIXLY_CORRECTvariable esté configurada.

Esta variable de entorno puede afectar el comportamiento de otras herramientas, especialmente si tiene herramientas GNU instaladas.

  1. La sustitución de procesos no está disponible.

La sustitución de procesos es la sintaxis <(...)o >(...).

  1. Los componentes .y sourceno buscan en el directorio actual el argumento de nombre de archivo si no se encuentra buscando en PATH.

Entonces, si su secuencia de comandos . fooesperaba que generara un archivo con el nombre fooen el directorio actual, eso no funcionará. Deberías hacer . ./foo, en su lugar.

Como puede adivinar por los números, hay muchas diferencias menores en el comportamiento de bash en el modo POSIX. Mejor use un shebang si quiere usar bash para sus scripts.

Al verificar, parece que la gran mayoría de los scripts de shell que escribí o uso explícitamente declaran /bin/bash en el shebang (muy pocos de ellos) o declaran /bin/sh (casi todos ellos), por lo que al menos debería no ser un problema. Gracias.
Creo que la sustitución de procesos ya está disponible. También lo probé en Catalina con éxito. Consulte: zsh.sourceforge.net/Intro/intro_7.html
@Siu todavía no ayudará con los scripts que usan /bin/sho /bin/bashen el shebang. Zsh es solo el shell interactivo predeterminado, no reemplazó a bash en todas partes
@muru Ah, entiendo. No leí la respuesta detenidamente y pensé que el autor estaba hablando de que la sustitución de procesos no está disponible en zsh😅

En el espíritu de mantener las cosas simples...

¿Alguien puede proporcionar una comparación práctica simple o obstáculos específicos que necesitaré saber para poder comenzar a trabajar para estar listo para el nuevo caparazón cuando se lance Catalina?

Si está pensando en usar el nuevo shell predeterminado, considere:

  • Si desea probar Zsh y sentir algunas de las diferencias sin cambiar la configuración de la carcasa en su máquina, puede probar Powerline10k en un contenedor Docker y ver si es su taza de té.
  • Si no necesita todas las campanas y silbatos y usa Bash solo para scripts básicos, es bastante fácil configurar su shell como lo han explicado otros aquí. Y si decide que quiere usar funciones en Bash 5, es una actualización bastante trivial para macOS .
  • Si desea mejorar la portabilidad de sus scripts para que sea más probable que funcionen como se espera en ambos shells, pruébelos para que cumplan con POSIX y elimine cualquier "bashism". He usado ShellCheck para esto y funciona bastante bien para scripts menos complicados.

Si bien no hay un camino en particular claro, estos tres enfoques deberían brindarle la confianza suficiente para tomar una decisión informada sin sobrediseñar el problema o el espacio de solución.