¿Puedo suponer que se han zsh
instalado suficientes personas para ejecutar scripts con un
#!/usr/bin/env zsh
como shebang?
¿O hará que mis scripts no se puedan ejecutar en demasiados sistemas?
Aclaración: Estoy interesado en programas / scripts que un usuario final quiera ejecutar (como en Ubuntu, Debian, SUSE, Arch & c.)
bash
zsh
portability
shebang
Profpatsch
fuente
fuente
zsh
pueden ser populares, mientras que en otros (sector bancario) es prácticamente desconocido. Creo que deberías dar mucha más información si necesitas consejos adecuados sobre este tema.zsh
instalado en ninguno de mis sistemas, y no lo instalaría para un solo script. Incluso debes evitar los bashismos, aunque bash suele estar disponible.Respuestas:
Para portabilidad, no. Si bien
zsh
se puede compilar en cualquier Unix o similar a Unix e incluso Windows al menos a través de Cygwin, y está empaquetado para la mayoría de los Me gusta de Unix de código abierto y varios comerciales, generalmente no se incluye en la instalación predeterminada.bash
por otro lado, se instala en sistemas GNU (comobash
es el shell del proyecto GNU) como la gran mayoría de los sistemas basados en Linux no integrados y, a veces, en sistemas no GNU como Apple OS / X. En el lado comercial de Unix, el shell Korn (la variante de AT&T, aunque más laksh88
única) es la norma y ambos,bash
yzsh
están en paquetes opcionales. En los BSD, el intérprete de comandos interactivo preferido es a menudotcsh
mientras quesh
se basa en el Shell de Almquist opdksh
ybash
ozsh
necesidad de ser instalado como paquetes opcionales también.zsh
se instala por defecto en Apple OS / X. Incluso solía ser el/bin/sh
allí. Se puede encontrar por defecto en algunas distribuciones de Linux como SysRescCD, Grml, Gobolinux y probablemente otras, pero no creo que ninguna de las principales.Por
bash
ejemplo, está la cuestión de la versión instalada y, como consecuencia, las características disponibles. Por ejemplo, no es raro encontrar sistemas conbash3
ozsh3
. Además, no hay garantía de que el script para el que escribe ahorazsh5
funcione,zsh6
aunquebash
sí intentan mantener la compatibilidad con versiones anteriores.Para los scripts, mi opinión es: use la sintaxis de shell POSIX ya que todos los Unices tienen al menos un shell llamado
sh
(no necesariamente en/bin
) que puede interpretar esa sintaxis. Entonces no tiene que preocuparse tanto por la portabilidad. Y si esa sintaxis no es suficiente para su necesidad, entonces probablemente necesite más que un shell.Entonces, sus opciones son:
fuente
No, no puedes. Lo que está garantizado disponible es
/bin/sh
, esencialmente, el shell Bourne original. Casi todas (¡tenga en cuenta "casi"!) Las instalaciones de Linux tendrán bash, pero en los sistemas * BSD es raro (la persuasión BSD tiene dudas graves sobre el código GPL, como bash). No sé cuál es el shell estándar en Mac, pero de nuevo, hay dudas sobre GPL. Lo mismo para Solaris.zsh es un shell de nicho, no está en la instalación predeterminada de Fedora (y no creo que sea el predeterminado para ninguna distribución importante).
fuente
bash
(aunque esos sistemas probablemente no sean los principales objetivo que el OP tenía en mente para su pregunta)Creo que realmente depende de qué características adicionales de zsh estés usando y dónde. Si planea distribuir su script entre los diferentes usuarios y sistemas, le sugiero que use bash o incluso sh .
Al mismo tiempo, si su script está diseñado para ejecutarse en toda su organización y tiene la convención de tener zsh en sus máquinas (por ejemplo, el mismo AMI básico) y su tarea tiene claros beneficios de extensiones como selectores de archivos avanzados u otras cosas de http: / /www.rayninfo.co.uk/tips/zshtips.html ¡Diría que adelante!
fuente
Como se indicó,
bash
está comúnmente disponible en la instalación predeterminada para muchas distribuciones. Su script no alcanzará la mayor base de usuarios si confía enzsh
.Una pregunta importante a responder antes de diseñar su script es " ¿Por qué importa en qué shell se ejecuta un script? "
Diferentes shells usan una sintaxis diferente u ofrecen funciones de shell adicionales que pueden no ser compatibles con otros shells. Para escribir una secuencia de comandos para el "mundo general del usuario final de Linux", determine si su secuencia de comandos usa alguna sintaxis o funciones de shell que dependen de un entorno de shell particular.
Por ejemplo,
bash
shell admite ciertas expansiones que no son compatibles condash
Bourne shell o lo que sea que/bin/sh
apunte al sistema del usuario.Intenta ejecutar
echo {1..10}
en/bin/sh
comparación con/bin/bash
y obtendrás resultados muy diferentes.Lo mismo ocurre con lo
zsh
que, aunque admite la mayoría de labash
sintaxis, ofrece expansión y sintaxis adicionales que no es compatible con elbash
shell. Vea estas tablas comparando shells para ejemplos específicos.Puede ampliar su base de usuarios potenciales más allá
bash
al adherirse a los scripts que funcionan cuando se les llama#!/bin/sh -u
. Sin embargo, esto da lugar a otra pregunta importante: " ¿Qué se sacrifica a cambio de una mayor portabilidad? "Determine si las diferencias relacionadas con problemas de seguridad, funcionalidad, eficiencia o cualquier otra cosa que considere una prioridad para su script valdrían la pena. Es posible que no desee el uso generalizado de un script con una vulnerabilidad de seguridad conocida solo porque funciona en más entornos.
Se escriben tantos scripts para
bash
que el soporte para estos scripts se utilice como criterio al comparar shells de comandos . Muchas más personas podrán ejecutar su script que si se basa enzsh
cualquier otra sintaxis exclusiva de un entorno de shell.Además, tenga en cuenta que, en última instancia, no tiene control sobre cómo el usuario ejecuta el script (también es útil para depurar scripts en diferentes shells ):
Por lo tanto, lo mejor que puede hacer al respecto es hacer que sus scripts sean portátiles, siempre que no haya un gran sacrificio en su funcionamiento.
También puede ver convenciones de codificación Bash: desbordamiento de pila .
fuente
Lo único que casi puede garantizar es que hay un
/bin/sh
. Eso podría ser un shell vinculado realmente estático, o puede ser un enlace a otro shell. Ese otro shell generalmente detecta que se llama sh y se ejecutará en modo de compatibilidad.Observe el casi en la primera oración.
Cada sistema similar a Unix en el que trabajé lo tenía. Muchos de ellos también tenían instalado bash (pero no todos . Por ejemplo, bash no está instalado por defecto en algunos BSD. Algunas distribuciones de Linux se envían con DASH , el shell Debian Almquist en su lugar.
Lo que puede garantizar son sus instrucciones de instalación. Puede agregar una línea al archivo README que indique que necesita zsh. Si crea un paquete, puede marcar zsh como una dependencia. Puede verificarlo con las herramientas autoconf / automake. Puede comprobar si se encuentra zsh en el script de instalación (comience con / bin / sh e intente localizar zsh, si se encuentra, continúe. Si no se muestra un error, por ejemplo, "Advertencia: ZSH no está instalado. ¡Lea el archivo de instrucciones de instalación! ".)
Estoy seguro de que olvidé algunas opciones más. Pero los puntos clave son:
fuente
/bin/sh
. Requiere unash
que en el entorno correcto (que no tiene que ser el entorno predeterminado) se comporte como se especifica./bin/sh
puede no ser un shell POSIX. Por ejemplo, en Solaris 10 y versiones anteriores, todavía era un shell Bourne y el estándarsh
estaba en/usr/xpg4/bin
.