it-swarm-es.tech

¿Cuáles son las diferencias fundamentales entre los shells mainstream * NIX?

¿Cuáles son las diferencias fundamentales entre los shells mainstream * NIX y qué escenarios podrían incitarlo a usar uno sobre el otro? Entiendo que algunos de ellos probablemente se reduzcan a las preferencias del usuario, pero solo he usado bash y estoy interesado en saber dónde podría ser útil otro Shell.

Además, ¿hay algún impacto en los scripts de Shell escritos por el usuario cuando se ejecuta bajo un Shell u otro o es simplemente una cuestión de cambiar el Shell en la parte superior del archivo? Mi instinto dice que no es tan fácil.

52
conorgriffin

Para uso interactivo, hay dos contendientes principales, bash y zsh , más el rezagado tcsh y el recién llegado pez .

  • Bash es el Shell oficial del proyecto GNU) y el Shell predeterminado en la mayoría de las distribuciones de Linux. En otros dispositivos que no se envían con un Shell interactivo decente como parte de la instalación base, creo que bash es lo que la gente tiende a elegir, en un bucle de autorrefuerzo "bash está en todas partes, así que también lo usaré". Vea también ¿Por qué bash está en todas partes? (con mucha información histórica).

  • Zsh tiene casi todas las funciones de bash y muchas más (¡útiles!). Su principal inconveniente es ser menos conocido, lo que en términos prácticos significa que es menos probable que lo encuentre ya instalado en un sistema que alguien más configuró y hay menos documentación de terceros al respecto. Vea también ¿Qué características de zsh usa? , ¿Qué características están en zsh y faltan en bash, o viceversa? .

  • Tcsh fue una vez (hasta principios de la década de 1990) el Shell con las mejores características interactivas, como su predecesor csh. Eso lo hizo popular para uso interactivo (pero no para scripting ). Zsh se puso al día con tcsh y mejoró bastante rápidamente, y bash se puso al día (con finalización programable) a principios de la década de 2000, mientras que tcsh apenas ha progresado en los últimos 15 años. Por lo tanto, hay pocas razones para aprender tcsh ahora.

  • Fish intenta ser más limpio que sus predecesores. Tiene algunas características ordenadas (sintaxis más simple, color de sintaxis en la línea de comando) pero carece de otras (lo que no le guste al autor). La comunidad de peces es mucho más pequeña que incluso zsh, lo que hace que los efectos sean aún más agudos.


Para las secuencias de comandos, hay varios idiomas a los que puede que desee dirigirse, dependiendo de cuán portátil desee que sean sus secuencias de comandos.

  • Cualquier cosa que pretenda ser similar a Unix tiene un Shell derivado de Bourne como /bin/sh. Todavía hay algunas unidades comerciales en las que /bin/sh No es POSIX compatible.

  • Casi todos los Unix que se ejecutan ahora tienen un sh ejecutable que es al menos compatible con al menos POSIX.2-1992 y generalmente al menos POSIX: 2001 a.k.a. Single Unix v . Este Shell puede vivir en un directorio diferente como /usr/bin/posix O /usr/xpg6/bin. Las capas de emulación POSIX también existen para casi todos los sistemas que son lo suficientemente potentes como para admitirlo, lo que lo convierte en un objetivo atractivo.

  • Muchos sistemas Unix tienen ksh9 , que trae algunas características muy útiles de las que carece POSIX sh (matrices, matrices asociativas, globs extendidos (*(foo), @(foo|bar), ...) , globos nulos (~(N)foo*), ...). Ksh era inicialmente un software comercial (se convirtió en gratuito en 2000, después de que se establecieron algunos hábitos), y muchas unidades gratuitas (Linux, * BSD) se acostumbraron a proporcionar solo un clon gratuito mucho más antiguo ( pdksh ) carece de muchas de estas características útiles. Pdksh ahora se está desplazando por mksh fuera de OpenBSD, pero incluso mksh no logra implementar todas las características de ksh93. Hoy, usted puede No cuente con que ksh93 esté disponible en todas partes, especialmente en Linux, donde bash es la norma.

  • Bash siempre está disponible en Linux (excepto algunas variantes integradas) y, a menudo, en otros dispositivos. Tiene la mayoría de las características útiles de ksh93, aunque a veces con una sintaxis diferente.

  • Zsh tiene la mayoría de las características útiles de ksh93 y bash. Su sintaxis central es más limpia pero incompatible con Bourne. Excepto para macOS, no cuente con que zsh esté disponible en un sistema que no instaló.

  • Para secuencias de comandos más avanzadas, puede recurrir a Perl o Python . Estos lenguajes tienen estructuras de datos adecuadas, características de manipulación de texto decentes, combinación de procesos y mecanismos de comunicación decentes, y toneladas de bibliotecas disponibles. La mayoría de los sistemas Unix los tienen, ya sea incluidos con el sistema operativo o instalados por el administrador (porque hay tantos scripts Perl y Python) que es un sistema raro que no tiene al menos uno de cada).

Hay dos sabores básicos de Shell, sh (por ejemplo, bash) y csh (por ejemplo, tcsh). Para uso interactivo, todo se reduce a lo que estás acostumbrado. He usado csh, y luego tcsh, durante años y sería doloroso cambiar, solo porque estoy tan acostumbrado. También he usado bash, y no creo que haya ninguna razón convincente para cambiar. Excepto tal vez si uno u otro no está disponible en las máquinas que usa habitualmente.

Para la programación, la sintaxis es diferente. No solo puede cambiar el Shell, sino que también debe cambiar la sintaxis del script. Para las secuencias de comandos, desea utilizar sh o bash. La sintaxis es mucho más adecuada para las secuencias de comandos, como se explica aquí (gracias a Riccardo Murri por el enlace. Es una buena guía sobre secuencias de comandos bash .

Si no se ha decidido por un Shell, y espera escribir algunos scripts, usaría bash solo para reducir la cantidad de cosas que necesita aprender.

27
KeithB

En los viejos tiempos, cuando AT&T inventó UNIX, estaba Bourne Shell, escrito por Steve Bourne. Era bastante básico y carecía de muchas herramientas que damos por sentado hoy en día.

AT&T no estaba realmente en el negocio de UNIX, por lo que en este momento Berkelely adoptó el sistema operativo muy básico, e hicieron algunos cambios en BSD UNIX. Entre muchos cambios, se encontraba un nuevo Shell, llamado csh, que tenía muchas mejoras sobre sh, incluido el control del trabajo, un mejor uso interactivo, etc. Desafortunadamente, decidieron que la sintaxis de programación sh apestaba y crearon la suya propia (algo mal) copiada de los estilos de codificación C. (Una diatriba clásica es http://www.faqs.org/faqs/unix-faq/Shell/csh-whynot/ ) Entonces ahora había dos sintaxis.

Más tarde, realizaron mejoras en CSH agregando la finalización de pestañas y algunas otras cosas. Esto se convirtió en tcsh, y si usa CSH, este es probablemente el que usa.

AT&T decidió que no estaba totalmente fuera del negocio de UNIX, y también lo pulieron. David Korn (Nice guy) creó el Korn Shell. Basado en la idea de extender la sintaxis de Bourne Shell, agregó muchas cosas tanto para programadores como para uso interactivo. En realidad, hay algunas versiones, y rara vez puede ver cosas como ksh88 y ksh93, que denotan las variantes.

Luego vinieron FSF y el GNU OS. Querían hacer su propio SO compatible con UNIX llamado Hurd, y querían un Shell mejor para ello. Llamaron bash, para Bourne Again Shell. Reglas POSIX entró por esta vez y querían hacer el POSIX Shell. Miraron a su alrededor, tomando la sintaxis de Bourne Shell y las mejoras de Korn Shell , además de robar y extender las funciones interactivas de tcsh. Se convirtió en el Shell de facto en Linux, por lo que es muy común.

También está el zsh, escrito para ser el "último" Shell. También es muy común en el mundo de Linux. Extendió bash (y polinizó un poco, algunas cosas nuevas volvieron a bash).

Si tuviera que elegir un Shell, elegiría bash o zsh. bash posiblemente está en algunos lugares más que zsh. zsh es más poderoso, pero bash ha estado bien para mí. Real/bin/sh Bourne Shell está presente solo por razones históricas. bash tiene prácticamente todo lo que ksh tiene para ofrecer y más. La sintaxis es más limpia que csh o tcsh, y tiene mejores características que cualquiera de ellas.

Convertir un script depende de qué a qué. El estilo Bourne Shell (sh, ksh, bash, zsh) hacia o desde el estilo csh (csh, tcsh) será difícil. Pasar de lo antiguo a lo más nuevo (/ bin/sh => bash,/bin/ksh => zsh) será más fácil que a la inversa.

12
Rich Homolka

Las dos ramas principales de los shells son los derivados Bourne Shell (sh, bash, ksh, ash, yash y zsh) y los derivados csh (tcsh y ... uhm ... tcsh).

Sospecho (aunque no tengo números reales) que bash es el más utilizado, parece ser el Shell predeterminado en la mayoría de los linux.

La mayoría de las cosas escritas en un derivado de Shell bourne probablemente funcionarán en otros. La mayoría de las cosas escritas en un Bourne Shell probablemente tendrán que modificarse para ejecutarse bajo csh o tcsh.

Personalmente usé ksh cuando comencé porque eso era lo que estaba en el sistema que estaba usando. Principalmente uso bash ahora.

8
mazianni

He usado numerosas conchas a lo largo del tiempo. No es nada súper avanzado, pero sí muchas cosas prácticas de programación y sysadmin que han requerido suficiente personalización.

Creo que zsh tiene más opciones de personalización, al menos antes, pero después de usarlo durante algunos años tuve suficiente con sus problemas de estabilidad y codificación de caracteres. Bash es sólido como una roca, nunca tuvo problemas similares y está instalado en todas partes.

1
Ari T