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

52

¿Cuáles son las diferencias fundamentales entre los shells mainstream * NIX y qué escenarios pueden solicitarle que use uno sobre el otro? Entiendo que algo de esto probablemente se reduzca 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.

conorgriffin
fuente

Respuestas:

52

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

  • Bash es el shell oficial del proyecto GNU y el shell predeterminado en la mayoría de las distribuciones de Linux. En otros equipos 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é". Ver también ¿Por qué es bash en todas partes? (Con mucha información histórica).

  • Zsh tiene casi todas las características de bash y muchas más (¡útiles!) Características. 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 configurado por otra persona y hay menos documentación de terceros al respecto. Consulte también ¿Qué características de zsh utiliza? , ¿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 secuencias de comandos ). 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 la de 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 como Unix tiene un shell derivado de Bourne como /bin/sh. Todavía hay algunas unidades comerciales alrededor de las cuales /bin/shno es compatible con POSIX .

  • Casi todos los Unix que se ejecutan ahora tienen un shejecutable que es al menos compatible con al menos POSIX.2-1992 y generalmente al menos POSIX: 2001 también conocido como Single Unix v3 . Este shell puede vivir en un directorio diferente como /usr/bin/posixo /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 ksh93 , que reúne algunas características muy útiles que carece POSIX sh (matrices, arrays asociativos, globos largos ( *(foo), @(foo|bar), ...), null pegotes ( ~(N)foo*), ...). Ksh fue 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 ) que carecía de muchas de estas características útiles . Pdksh ahora está siendo desplazado por mksh fuera de OpenBSD, pero incluso mksh no implementa todas las características de ksh93. Hoy en día, no puede contar 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 en el sistema operativo o instalados por el administrador (porque hay tantos scripts de Perl y Python que es un sistema raro que no tiene al menos uno de cada uno).

Gilles 'SO- deja de ser malvado'
fuente
44
Para las secuencias de comandos, apunto el guión, (a menos que necesite las características avanzadas de bash) que tiene un conjunto mínimo de características y es una queja posix para la máxima compatibilidad. (y es pequeño ligero y rápido)
hildred
Gran documentaion! Dos notas Primero, Solaris es una de esas "unidades comerciales en las que / bin / sh no es compatible con POSIX". Específicamente, usa jsh(¡que no es un shell java!), Que carece de sustitución variable como ${VAR#foo}y ${VAR%bar}.
Adam Katz
En segundo lugar, tcshes bastante popular entre los usuarios de UNIX que aprendieron sus trucos ante los ~ mediados de los años 90 (que se produjo la introducción de ambos bashy zsh), especialmente entre los de mayor edad UNIX + Cdesarrolladores, que comenzó su vida con csh(recordatorio, el c de cshstands para la Clengua , que fue la inspiración para sus diferencias con las conchas de estilo bourne). Consulte también la programación de Csh considerada dañina , que a menudo uso para obtener consejos sobre la magia profunda POSIX (además de sus argumentos anti-csh).
Adam Katz
Mac OS X nunca es "OS / X". (: ¿Y cómo es zsh incompatible con Bourne? (Bueno, excepto por cosas como no expansiones de variables de división de palabras).
SilverWolf - Reinstalar a Mónica el
@seaturtle Las expansiones de variables que no dividen palabras son la principal diferencia que rompería muchos scripts sh si intentara ejecutarlos con zsh (a menos que ejecute zsh en un modo de emulación sh / ksh).
Gilles 'SO- deja de ser malvado'
27

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. Esta es una buena guía sobre las 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.

KeithB
fuente
12

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, había 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, (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/ ) Así que 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 (buen tipo) creó el shell Korn. Basado en la idea de extender la sintaxis de shell Bourne, 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 sistema operativo GNU. Querían hacer su propio sistema operativo compatible con UNIX llamado Hurd, y querían un mejor shell para ello. Llamaron a bash, por Bourne Again SHell. Las reglas POSIX aparecieron justo por esta vez, y querían hacer el shell POSIX. 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 shell 'definitivo'. 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 caparazón, 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 de shell Bourne (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.

Rich Homolka
fuente
Tenga en cuenta que la página csh-whynot se escribió en septiembre de 1995 (verifique la etiqueta de versión en la parte superior). No lo sé, pero esperaría que muchas cosas hayan cambiado en los 18 años desde entonces.
un CVn
8

Las dos ramas principales de los shells son los derivados de shell Bourne (sh, bash, ksh, ash, yash y zsh) y los derivados de 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 shell Bourne probablemente tendrán que modificarse para ejecutarse bajo csh o tcsh.

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

mazianni
fuente
1
fish is a csh inspired shell
hildred
1

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.

Ari T
fuente