Ambos shells ofrecen potentes lenguajes de programación, pero no son totalmente compatibles.
Cuando se trata de scripts de shell en sistemas operativos tipo Unix, dominan dos shells: Bash (Bourne Again Shell) y Zsh (Z Shell). Si es programador o administrador de sistemas, la elección entre estos dos impacta significativamente su eficiencia y productividad.
Comprender las diferencias y similitudes entre estos dos shells le ayudará a optimizar su flujo de trabajo de línea de comandos. Conocer los matices de cada caparazón le ayudará a tomar decisiones informadas.
¿Qué son Bash y Zsh?
Bash es popular tanto en sistemas Linux como macOS. Es una herramienta poderosa que puede utilizar para interactuar con el sistema operativo y ejecutar comandos. Tú también puedes use Bash para scripts de shell, que automatiza tareas escribiendo scripts que contienen más de un comando.
Zsh (Z shell) es una versión extendida de Bash que tiene muchas más funciones. Es el shell predeterminado en macOS. También se está volviendo cada vez más popular en los sistemas Linux.
Cómo cambiar de Bash a Zsh
Si está utilizando un sistema Linux y desea cambiar a Zsh, comience por usando su administrador de paquetes para instalarlo. Por ejemplo, en Debian o Ubuntu, utilice el siguiente comando:
sudo apt install zsh
Después de instalarlo en su sistema, cámbielo ejecutando el siguiente comando:
chsh -s $(which zsh)
Si está utilizando macOS, Zsh ya está instalado. Para cambiar a él, ejecute el siguiente comando:
chsh -s /bin/zsh
Para volver a Bash, reemplace Zsh con Bash en los comandos anteriores.
Para comprobar qué shell está utilizando, ejecute el siguiente comando:
echo $SHELL
Esto le ayudará a confirmar que está utilizando el shell que pretendía.
Diferencias entre Zsh y Bash
Existen varias diferencias entre Zsh y Bash. Tener en cuenta estas diferencias le ayudará a decidir qué caparazón se adapta mejor a sus necesidades.
1. Personalización inmediata
Zsh ofrece una manera más fácil de personalizar sus mensajes usando %-secuencias de escape basadas en. Esto permite indicaciones dinámicas con color e información. Para personalizar el indicador de shell, defina el PS1 (Mensaje principal).
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
El mensaje personalizado anterior muestra el nombre de usuario, el nombre de host y el directorio actual en diferentes colores:
Hay muchos otras formas de personalizar el mensaje Zsh, permitiéndole configurar un indicador de administrador, incluir la fecha y la hora y guardar el nuevo mensaje.
Bash utiliza un enfoque ligeramente diferente cuando se trata de personalización rápida. Utiliza códigos de escape para especificar cambios de color y formato en el mensaje. Para lograr la misma personalización que Zsh arriba, puede utilizar el siguiente mensaje personalizado.
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
Usando \[\033[0m\] es crucial ya que garantiza que los cambios de color no afecten el texto que sigue al mensaje.
2. Soporte para matrices asociativas
Zsh admite de forma nativa matrices asociativas. Estas matrices proporcionan una manera conveniente de asociar datos, lo que facilita la organización y recuperación de información. Usar declarar-A comando para declarar explícitamente una matriz asociativa:
# Declare an associative array in Zsh
declare -A my_assoc_array
Luego puede asignar valores a la matriz asociativa:
my_assoc_array=(key1 value1 key2 value2)
Y, finalmente, accede a los valores usando sus claves:
echo $my_assoc_array[key1] # Outputs: value1
Bash ha incluido soporte nativo para matrices asociativas. desde la versión 4.0. Declaras y asignas valores de la misma manera que lo harías en Zsh. Pero cuando se trata de acceder a valores de matriz, es necesario encerrar la clave entre llaves:
echo "${my_assoc_array[key1]}"
La principal diferencia es que el soporte de Zsh para matrices asociativas tiene más funciones y es más avanzado que Bash. Zsh permite que las matrices asociativas tengan claves de varios tipos de datos, no solo cadenas. Bash solo admite claves de cadena.
En versiones anteriores de Bash, era necesario encontrar una manera de solucionarlo o tener herramientas externas para usar matrices asociativas.
3. Patrones globales extendidos
Los patrones globales extendidos proporcionan una forma poderosa y flexible de seleccionar y manipular archivos y directorios según varios criterios. Son útiles cuando trabaja con estructuras de archivos complejas o cuando necesita un control preciso sobre las selecciones de archivos.
En un script Zsh, puede habilitar estos patrones usando el setopto dominio. Por ejemplo, para que coincida con todos .TXT archivos en el directorio actual:
setopt extended_glob
txt_files=(*.txt)
Para hacer coincidir todos los archivos excepto aquellos con extensión .log:
setopt extended_glob
non_log_files=^(*.log)
En Bash, debes habilitarlos usando el comprar comando con el extglob opción. Por ejemplo, para que coincida con todos .TXT archivos en el directorio actual:
shopt -s extglob
txt_files=(*.txt)
Para hacer coincidir todos los archivos excepto aquellos con .registro extensión:
shopt -s extglob
non_log_files=!(*.log)
La principal diferencia entre Zsh y Bash cuando se trata de patrones globales es el comando utilizado para habilitarlos. Sin embargo, observe que algunos operadores son diferentes entre los dos shells.
4. Expansión de parámetros avanzada
Zsh admite la expansión indirecta de parámetros. Esto le permite expandir el valor de una variable cuyo nombre está almacenado en otra variable. Para lograr esto, debe anteponer el nombre de la variable con un signo de exclamación. !.
name="foo"
result="${!name}"
echo "$result"
Bash, por otro lado, no permite la expansión indirecta de forma nativa. La solución para esto es usar el evaluar comando incorporado o el ${!var} sintaxis para referencias de variables indirectas.
name="world"
var="name"
echo ${!var} # This will output: world
Similitudes entre Bash y Zsh
Si bien existen diferencias entre Bash y Zsh, también comparten algunas similitudes.
1. Sintaxis de la línea de comando
Bash y Zsh comparten una sintaxis de línea de comando similar. Esto es fantástico porque significa que la mayoría de los comandos y scripts que escriba funcionarán en cualquiera de los shells, sin modificaciones. Zsh está construido sobre Bash, por lo que incluye los mismos comandos y funciones básicos.
Sin embargo, existen diferencias muy pequeñas en la sintaxis que deberá identificar y ajustar.
2. Coherencia de sustitución de comandos
La sustitución de comandos es el proceso de incorporar la salida de un comando a otro. Es consistente entre ambos caparazones.
result=$(ls)
Tanto en Bash como en Zsh, puedes usar el $(comando) sintaxis para sustituir la salida de un comando en una variable. Esto permite una fácil portabilidad de scripts entre los dos shells.
3. Opción de depuración de scripts
Tanto Bash como Zsh usan -X bandera para la depuración de scripts. Cuando ejecuta un script con este indicador, muestra cada comando antes de ejecutarse. Esto le ayuda a identificar problemas en sus scripts.
# Debugging a script in both Bash and Zsh
#!/bin/bash -x
echo "Debugging Bash script"
En este script Bash, el -X El indicador permite la depuración. Puedes utilizar un enfoque similar en Zsh; solo reemplaza intento con zsh.
Consideraciones para elegir entre Zsh y Bash
- Compatibilidad y portabilidad: Bash es el shell predeterminado en muchos sistemas basados en Unix. Esto lo convierte en una opción más segura para secuencias de comandos multiplataforma. Si necesita que sus scripts se ejecuten en una amplia gama de sistemas sin modificaciones, Bash es una mejor opción.
- Complejidad de script y funciones avanzadas: Zsh proporciona funciones avanzadas como matrices asociativas, patrones globales extendidos y expansión de parámetros avanzada. Esto simplifica las tareas complejas de secuencias de comandos. Si sus scripts requieren manipulación avanzada de cadenas o estructuras de datos, Zsh es una mejor opción.
- Comunidad y ecosistema de complementos: Tanto Bash como Zsh tienen comunidades activas, pero Zsh tiene una comunidad más fuerte y un extenso ecosistema de complementos y temas. Si valora la personalización, la vibrante comunidad de Zsh y la compatibilidad con complementos pueden ser una ventaja significativa.
- Facilidad de aprendizaje: Si es nuevo en el scripting de shell, Bash es un punto de partida más accesible. Tiene amplia documentación y recursos disponibles para principiantes. Esto hace que sea más fácil aprender los conceptos básicos de los scripts de shell.
Automatización de tareas mediante scripts de Shell
Saber cómo automatizar tareas utilizando scripts de shell es de gran importancia. Puede automatizar tareas repetitivas y ahorrar mucho tiempo.
También puede utilizar estos scripts para administrar cuentas de usuario, monitorear recursos del sistema, realizar copias de seguridad de datos y realizar mantenimiento de rutina. Cuando se redactan cuidadosamente, también pueden reducir la posibilidad de error humano.