Pregunta ¿Qué está en riesgo al cambiar a ZSH?


La mayoría de los consejos para Mac se escriben suponiendo que usas el shell Bash. Si cambio a zsh, ¿qué tan incompatible me vuelvo con las secuencias de comandos actuales de Bash que tengo en mi sistema, y ​​los consejos que las personas de SU me dan?

¿El #!/bin/sh línea al comienzo de mis scripts ayuda?

Editar: Irrelevante para la pregunta es por qué quiero hacer esto. Mejor terminación de pestañas. Acabo de probar zsh poniendo un script de inicio de sesión como se sugiere aquí y estoy completamente impresionado.


4


origen




Respuestas:


La línea shebang que muestra significa ejecutar el script utilizando el shell Bourne (u otro shell en modo compatibilidad). Esos scripts probablemente continúen ejecutándose usando el mismo shell que ahora si cambia a zsh como su caparazón interactivo. La única forma que cambiará es si enlazas sh a zsh, pero eso no debería cambiar la funcionalidad.

Encontrarás una cierta cantidad de compatibilidad entre zsh y Bash cuando se utiliza como shell de inicio de sesión o cuando se escriben scripts que invocan específicamente uno u otro usando líneas shebang como:

#!/usr/bin/bash

o

#!/usr/bin/zsh

Sin embargo, hay muchas cosas que zsh hace de manera diferente o que Bash no puede hacer en absoluto. Bash es mucho más utilizado, por lo que hay menos personas familiarizadas con las complejidades de zsh. Sin embargo, la información disponible está ampliamente disponible. Además, encontrarás que hay más de la ayuda adecuada disponible aquí.

Encontrará que para escribir scripts cualquiera de los dos shell es considerablemente más poderoso que el shell Bourne (sh), pero a expensas de la portabilidad. Además, dado que Bash es más utilizado que zsh, sus scripts son relativamente más portátiles.


4



Gracias por eso. Usted dice "cualquiera de los proyectiles es considerablemente más potente que el shell Bourne". Te refieres basho zsh como se muestra en la línea shebang? - Dan Rosenstark
@Yar: Sí, tanto Bash como zsh (e incluso el shell Korn, especialmente ksh93) tienen más capacidades que sh. - Dennis Williamson
De acuerdo, casi todos los scripts de shell están escritos para el modo de compatibilidad. No tenía ni idea. Mientras tanto mi línea shebang dice #!/usr/bin/env ruby la mayoría de las veces, pero uso muchas otras personas sh guiones. - Dan Rosenstark


No soy un usuario de zsh, pero por lo que he leído en SuperUser y en otros lugares, siempre he tenido la impresión de que sus fanáticos se centran más en sus características adicionales para el uso interactivo que en las secuencias de comandos. La primera oración de la descripción de zsh en el Sitio ZSH, se hace eco de este énfasis en las características interactivas: "Zsh es un shell diseñado para uso interactivo, aunque también es un poderoso lenguaje de scripting".

Dicho esto, si planea cambiar su shell de inicio de sesión, puede continuar escribiendo sus scripts en bash. Como señaló otra respuesta, los scripts bash serán más portátiles.

Scripts existentes con el explícito #!/bin/sh (o #!/bin/bash o cualquier otra ruta) continuará funcionando bien independientemente de su shell de inicio de sesión.


4



Cuando escribo guiones por mi cuenta, uso Ruby :) ¡buena respuesta, gracias! - Dan Rosenstark
usar zsh es increíblemente conveniente. Scripting it, en absoluto. Por cierto, zsh actúa de manera diferente dependiendo de cómo lo llame, es decir, si / bin / sh es un enlace simbólico a / bin / zsh, entonces zsh actuará más como / bin / sh - chiggsy


aquí encontrarás una lista de "bashisms", es decir, fragmentos de código que se ejecutarán en el shell bash pero no en otros shells compatibles con bourne.

Si desea lograr la máxima portabilidad al escribir scripts de shell, inicie su script con #!/bin/sh y evite los "bashisms", para que se ejecute en cualquier otro shell posix compatible, como ksh o zsh.


3



Gracias, buena información cuando se agrega a las otras respuestas. - Dan Rosenstark


/bin/sh apunta a bash, ejecutándolo en modo compatibilidad. Lo único que cambia los cambios de shell de inicio de sesión es qué complementos están disponibles y cómo funcionan. Los guiones siguen su línea shebang.


1



Cabe señalar que esto es cierto en algunos sistemas. En otros, está vinculado a dasho ash u otros, o incluso es realmente el auténtico Bourne shell en sí mismo. - Dennis Williamson
Sip. Pero la pregunta está etiquetada como "osx". - Ignacio Vazquez-Abrams
Desafortunadamente, "señaló" es demasiado pequeño para ser un comentario sobre SU. - Dan Rosenstark


Con "cambiar a zsh", supongo que te refieres a una de estas dos cosas:

  • usarás chsh (o equivalente) para cambiar su shell de inicio de sesión a zsh, o
  • usted configurará Terminal (o equivalente) para usar zsh como su shell predeterminado.

La mayoría de los programas de shell ("scripts" de shell) incluirán "Shebang" / "hash-bang" línea. El shebang declara qué intérprete (shell) debe interpretar (ejecutar) el programa que lo sigue.

Como indican varias otras respuestas, los programas de shell que usan una línea de shebang no se verán afectados por la selección del shell de inicio de sesión del usuario, ni por el shell interactivo que es el principal o el padre Nth de un programa shell lanzado.

Si está instalando una nueva versión de zsh e incluirlo en tu PATH, programas que usan un shebang como #!/usr/bin/env zsh usará esa nueva versión (cuando se inicie con un PATH que ponga el nuevo zsh primero). Esto solo puede causar problemas si se realizó algún cambio incompatible entre su versión anterior / original de zsh y el nuevo. Tenga en cuenta que esto sería un intra-zsh (enterrar-zsh-version) problema, no el problema entre shell sobre el que sospecho que está preocupado. Por lo general, esta es una categoría de error mucho más pequeña que si (por ejemplo) intentara ejecutar una corrida. intento programa con ksh.

No utilizar una línea shebang no es inherentemente portátil entre entornos de usuario. El resultado de intentar ejecutar un archivo ejecutable, no binario archivo que carece de un shebang depende del entorno (sistema operativo, shell, posiblemente shell de inicio de sesión y variables de entorno). Cuando se ejecuta un archivo de este tipo en mi sistema Mac OS X 10.4, el comportamiento varía de acuerdo con el shell que lo ejecuta. kshy intento ambos interpretan el archivo en una copia en horquilla de ellos mismos. zsh siempre lo pasa a /bin/sh. Si algún programa intentara exec directamente, fallaría con ENOEXEC (Esto sucede dentro del caparazón, simplemente "cubren" al "ejecutarlo" de una manera alternativa). Tengo un vago recuerdo de algunos sistemas antiguos que intentan usar el shell de inicio de sesión del usuario en esta situación, pero mi búsqueda rápida no arrojó nada útil.

 Un archivo no binario es un archivo que el kernel no reconoce como uno de sus formatos de objetos binarios admitidos.


En lo que respecta a la compatibilidad interactiva, zsh admite gran parte de la sintaxis extendida de intento y ksh (algunos de ellos deben estar habilitados con opciones de shell, sin embargo), gran parte del consejo "shell" que encuentre en Super User funcionará bien en zsh (incluso si parte de ella está compuesta de "bashisms"). Algunas cosas (enlaces de edición de línea de comandos, finalización, pantallas rápidas, etc.) son completamente diferentes de intento y ksh y requerirá una sintaxis diferente para operaciones similares.

  zsh tiene un poco de intento compatibilidad de finalización, pero nunca lo he intentado.


1



Todavía procesando esto. +1 por ahora :) - Dan Rosenstark
Funciona mejor (zsh's bash Completer) que bash. - chiggsy