it-swarm-es.tech

¿Bash o KornShell (ksh)?

No soy nuevo en * nix, sin embargo, últimamente he pasado mucho tiempo en el Prompt. Mi pregunta es ¿cuáles son las ventajas de usar KornShell (ksh) o Bash Shell? ¿Dónde están las trampas de usar uno sobre el otro?

Buscando entender desde la perspectiva de un usuario, en lugar de puramente scripting.

59
user13158

Golpetazo.

Las diversas implementaciones de UNIX y Linux tienen diferentes implementaciones de nivel de origen de ksh, algunas de las cuales son reales ksh, algunas de las cuales son implementaciones de pdksh y otras son solo enlaces simbólicos a otros Shell que tienen una personalidad "ksh". Esto puede llevar a extrañas diferencias en el comportamiento de ejecución.

Al menos con bash puede estar seguro de que se trata de una base de código única, y todo lo que necesita es preocuparse de qué versión (generalmente mínima) de bash está instalada. Después de haber realizado muchos scripts en prácticamente todos los UNIX modernos (y no tan modernos), la programación a bash es más confiable en mi experiencia.

46
j.e.hahn

La diferencia entre Kornshell y Bash es mínima. Hay ciertas ventajas que uno tiene sobre el otro, pero las diferencias son pequeñas:

  • BASH es mucho más fácil de configurar un mensaje que muestra el directorio actual. Hacer lo mismo en Kornshell es una piratería.
  • Kornshell tiene matrices asociativas y BASH no. Ahora, la última vez que usé arreglos asociativos fue ... Déjame pensar ... Nunca.
  • Kornshell maneja un poco mejor la sintaxis del bucle. Por lo general, puede establecer un valor en un bucle Kornshell y tenerlo disponible después del bucle.
  • Bash maneja obtener códigos de salida de tuberías de una manera más limpia.
  • Kornshell tiene el comando print que es mucho mejor que el comando echo.
  • Bash tiene terminaciones de pestañas. En versiones anteriores
  • Kornshell tiene el comando r history que me permite ejecutar rápidamente los comandos más antiguos.
  • Kornshell tiene la sintaxis cd old new que reemplaza old con new en su directorio y CDs allí. Es conveniente cuando se encuentra en un directorio llamado /foo/bar/barfoo/one/bar/bar/foo/bar y necesita cd para /foo/bar/barfoo/two/bar/bar/foo/bar En Kornshell, simplemente puede hacer cd one two y terminar con él. En BASH, tendrías que cd ../../../../../two/bar/bar/foo/bar.

Soy un viejo de Kornshell porque aprendí Unix en la década de 1990, y ese fue el Shell elegido en ese entonces. Puedo usar Bash, pero a veces me frustra porque, por costumbre, uso alguna característica menor que Kornshell tiene, que BASH no tiene y no funciona. Así que, siempre que sea posible, configuro Kornshell como mi predeterminado.

Sin embargo, te voy a decir que aprendas BASH. Bash ahora se implementa en la mayoría de los sistemas Unix, así como en Linux, y simplemente hay más recursos disponibles para aprender BASH y obtener ayuda que Kornshell. Si necesitas hacer algo exótico en BASH, puedes ir a Stackoverflow, publicar tu pregunta y obtendrás una docena de respuestas en unos minutos, ¡y algunas de ellas incluso serán correctas!.

Si tienes una pregunta de Kornshell y la publicas en Stackoverflow, tendrás que esperar a que un viejo y viejo hacker como yo se despierte de su siesta antes de recibir una respuesta. Y, olvídate de obtener una respuesta si están sirviendo pudín en el hogar de ancianos ese día.

BASH es simplemente el Shell de elección ahora, por lo tanto, si tiene que aprender algo, podría ir con lo que es popular.

122
David W.

Soy un veterano de Shell Korn, así que sé que hablo desde esa perspectiva.

Sin embargo, me he sentido cómodo con Bourne Shell, ksh88 y ksh93, y por lo que sé, qué funciones son compatibles en qué. (Debería omitir ksh88 aquí, ya que ya no se distribuye ampliamente).

Para uso interactivo, tome lo que se ajuste a sus necesidades. Experimentar. Me gusta poder usar el mismo Shell para uso interactivo y para programación.

Pasé de ksh88 en SVR2 a tcsh, a ksh88Sun (que agregó soporte de internacionalización significativo) y ksh93. Lo intenté, y lo odié porque aplastó mi historia. Entonces descubrí shopt -s lithist y todo estaba bien. (La opción lithist asegura que las nuevas líneas se conserven en su historial de comandos).

Para la programación de Shell, recomendaría seriamente ksh93 si desea un lenguaje de programación consistente, una buena conformidad con POSIX y un buen rendimiento, ya que muchos comandos comunes de Unix pueden estar disponibles como funciones integradas.

Si quieres portabilidad usa al menos ambos. Y asegúrese de tener un buen conjunto de pruebas.

Hay muchas diferencias sutiles entre las conchas. Considere, por ejemplo, leer de una tubería:

b=42 && echo one two three four |
    read a b junk && echo $b

Esto producirá diferentes resultados en diferentes conchas. El korn-Shell recorre las tuberías de atrás hacia delante; el último elemento en la tubería se ejecuta en el proceso actual. Bash no admitió este comportamiento útil hasta v4.x, e incluso en ese caso, no es el predeterminado.

Otro ejemplo que ilustra la consistencia: el propio comando echo, que quedó obsoleto por la división entre BSD y SYSV unix, y cada uno introdujo su propia convención para no imprimir nuevas líneas (y otros comportamientos). El resultado de esto todavía se puede ver en muchos scripts de configuración.

Ksh adoptó un enfoque radical para eso, e introdujo el comando print, que en realidad admite ambos métodos (la opción -n de BSD, y el carácter especial \c final de SYSV)

Sin embargo, para la programación seria de sistemas, recomendaría algo más que un Shell, como python, Perl. O vaya un paso más allá y use una plataforma como títere, que le permite observar y corregir el estado de grupos completos de sistemas, con una buena auditoría.

La programación en shell es como nadar en aguas inexploradas, o peor.

La programación en cualquier lenguaje requiere familiaridad con su sintaxis, sus interfaces y su comportamiento. La programación de shell no es diferente.

28
Henk Langeveld

Esto es un poco de una batalla de Unix vs Linux. La mayoría, si no todas las distribuciones de Linux, tienen bash instalado y ksh opcional. La mayoría de los sistemas Unix, como Solaris, AIX y HPUX tienen ksh como predeterminado.

Personalmente siempre uso ksh, me encanta la finalización de vi y uso Solaris para todo.

4
Kristian

Para los scripts, siempre uso ksh porque suaviza sobre gotchas .

Pero encuentro a bash más cómodo para el uso interactivo. Para mí, los emacs enlaces de teclas y la finalización de pestañas son los principales beneficios. Pero eso es principalmente una fuerza de hábito, no un problema técnico con ksh.

4
Jon Ericson

No tengo experiencia con ksh, pero he usado tanto bash como zsh. Prefiero zsh en lugar de bash debido a su compatibilidad con la generación de archivos de gran alcance, los modificadores de expansión variables y la finalización de pestañas más rápida.

Aquí hay una introducción rápida: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-Shell-youll-ever-need/

4
Chris AtLee

Mi respuesta sería "elige uno y aprende a usarlo". Ambos son conchas decentes; Probablemente, Bash tenga más campanas y silbidos, pero ambos tienen las características básicas que desearás. Bash está más universalmente disponible en estos días. Si estás usando Linux todo el tiempo, solo quédate con él.

Si está programando, intentar mantener la portabilidad simple para la portabilidad es una buena práctica, pero ahora que bash está tan disponible en estos días, es probable que algunos consejos estén un poco pasados ​​de moda.

Aprenda cómo usar la finalización y su historial de Shell; lee la página del manual de vez en cuando y trata de aprender algunas cosas nuevas.

3
Incident

@foxxtrot

En realidad, el Shell estándar es Bourne Shell (sh). /bin/sh en Linux es en realidad bash, pero si apuntas a scripts multiplataforma, es mejor que te quedes con las características del original Bourne Shell o escribas algo como Perl.

3
Hank Gay

Por un lado, bash ha completado la pestaña. Esto solo es suficiente para hacerme preferir a Ksh.

Z Shell tiene una buena combinación de las características únicas de ksh con las cosas agradables que proporciona bash, además de muchas más cosas además de eso.

2
Allen

Disponible en la mayoría de los sistemas UNIX, ksh es estándar, claramente diseñado, bien redondeado. Creo que los libros, las ayudas en ksh son suficientes y claros, especialmente el libro de O'Reilly. Bash es una misa. Lo guardo como inicio de sesión de Shell para Linux solo en casa.

Para uso interactivo, prefiero zsh en Linux/UNIX. Ejecuto scripts en zsh, pero probaré la mayoría de mis scripts, aunque las funciones en AIX ksh.

2
MeaCulpa