Contents

Zsh vs. Bash Scripting. Qual é a diferença?

Quando se trata de scripts de shell em sistemas operacionais do tipo Unix, dois shells dominam: Bash (Bourne Again Shell) e Zsh (Z Shell). Se é um programador ou um administrador de sistemas, a escolha entre estes dois tem um impacto significativo na sua eficiência e produtividade.

Compreender as discrepâncias e semelhanças entre estes dois shells pode ser vantajoso para otimizar o processo de trabalho da linha de comandos, uma vez que o conhecimento das suas características particulares permite fazer julgamentos bem informados.

O que são Bash e Zsh?

O Bash, uma interface de linha de comando versátil e amplamente utilizada, oferece uma ampla gama de funcionalidades em várias plataformas, como os sistemas Linux e macOS. Sendo uma ferramenta robusta e eficiente, permite que os utilizadores interajam facilmente com os seus sistemas operativos enquanto executam vários comandos ao mesmo tempo. Adicionalmente, as capacidades do Bash vão para além das interacções básicas através do seu suporte para shell scripting. Ao utilizar scripts que incluem vários comandos, os utilizadores podem automatizar eficazmente tarefas repetitivas ou demoradas, simplificando assim os processos de fluxo de trabalho.

Incorporando elementos dos sistemas operativos Mac e Linux, o Zsh é uma interface de linha de comandos versátil e rica em funcionalidades que serve de shell padrão para a plataforma macOS da Apple, ao mesmo tempo que ganha força entre várias distribuições Linux.

Como mudar do Bash para o Zsh

Para fazer uma transição perfeita da utilização de um sistema operacional Linux para a adoção do Zsh como seu shell padrão, comece empregando o respetivo gerenciador de pacotes da sua distribuição para fins de instalação. A título de exemplo, se estiver a trabalhar com um sistema baseado em Debian ou Ubuntu, execute o seguinte comando:

 sudo apt install zsh 

Depois de ter instalado o programa no seu computador, pode facilmente passar a utilizá-lo executando um comando específico no seu terminal ou na linha de comandos.

 chsh -s $(which zsh) 

Para fazer a transição para a shell Zsh num sistema operativo Mac, execute a seguinte diretiva no seu terminal:

 chsh -s /bin/zsh 

Para voltar a utilizar a shell Bash em vez de Zsh, basta modificar os comandos fornecidos anteriormente, substituindo “Zsh” por “Bash”.

Para verificar a shell atual que está a ser utilizada, execute a seguinte diretiva:

 echo $SHELL 

A incorporação da utilização de uma medida de confirmação pode ajudar a validar que o utilizador está a empregar o ambiente operacional pretendido, promovendo assim uma maior segurança relativamente à seleção efectuada.

Diferenças entre Zsh e Bash

Examinar as distinções entre Zsh e Bash é essencial para determinar qual desses shells se alinha com suas preferências e requisitos.

Personalização do prompt

O Zsh fornece um método conveniente de personalizar sua interface de linha de comando utilizando seqüências de escape baseadas em porcentagem dentro do prompt primário, denotado como PS1. Ao empregar essa abordagem, é possível criar prompts visualmente atraentes e informativos que incorporam elementos como cor e conteúdo gerado dinamicamente. De modo a personalizar o aspeto da sua linha de comandos da shell, deve primeiro estabelecer a configuração desejada definindo a variável PS1.

 PS1="%F{green}%n@%m %F{blue}%~ %f$ "

O prompt personalizado acima mencionado apresenta o nome de utilizador, o nome de domínio e o diretório de trabalho atual através de indicadores visuais de vários tons:

/pt/images/what-is-the-difference-zsh-vs-bash-scripting-in-the-terminal-prompt-customization.jpg

Alternativamente, existe uma infinidade de métodos para personalizar o prompt do Zsh, permitindo exibir uma indicação administrativa, incorporar a data e a hora atuais e preservar quaisquer modificações feitas no prompt atualizado.

O Bash emprega uma estratégia alternativa para a personalização do prompt em comparação com o Zsh. A utilização de códigos de escape permite a personalização da cor e do formato dentro do prompt. Para atingir um nível de personalização semelhante ao exemplo do Zsh, pode-se empregar o modelo de prompt personalizado subsequente:

 PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "

Empregar o uso de \\[\033[0m\\] é essencial, pois garante que quaisquer modificações na cor não afetarão o texto subsequente dentro do comando ou mensagem.

Suporte para Arrays Associativos

O Zsh, sendo uma linguagem nativa de programação em sistemas Unix-like, reconhece inerentemente o conceito de arrays associativos. As matrizes associativas são essencialmente colecções de pares chave-valor que facilitam a organização e a recuperação de informação com a maior facilidade. Para criar uma matriz associativa, pode-se empregar a palavra-chave “declare” seguida de “-A” para declarar explicitamente a sua existência.

 # Declare an associative array in Zsh
 declare -A my_assoc_array 

A matriz associativa pode ser depois imbuída de valores atribuídos.

 my_assoc_array=(key1 value1 key2 value2)

Para recuperar os valores associados às chaves de um dicionário, é possível utilizar a indexação para referenciar e aceder diretamente a esses valores. Esse processo envolve especificar a chave de interesse e usá-la como um índice para obter seu valor correspondente no dicionário.

 echo $my_assoc_array[key1] # Outputs: value1 

O Bash fornece suporte nativo para arrays associativos a partir da versão 4. O processo de declaração e atribuição de valores é semelhante ao do Zsh.No entanto, quando se trata de recuperar elementos da matriz, é necessário colocar o índice entre chavetas, {}.

 echo "${my_assoc_array[key1]}"

Uma distinção notável entre o Zsh e o Bash reside nas suas respectivas capacidades relativamente a arrays associativos. Embora ambos os shells ofereçam tal funcionalidade, o Zsh fornece um conjunto mais abrangente de recursos para essas estruturas de dados. Especificamente, o Zsh permite arrays associativos com valores chave de diversos tipos de dados para além de simples strings textuais; enquanto que o Bash restringe as suas chaves a consistirem exclusivamente em elementos string.

Em iterações anteriores da linguagem de programação Bash, a utilização de arrays associativos exigia a implementação de soluções alternativas ou o emprego de ferramentas externas.

Extended Globbing Patterns

Os padrões glob estendidos oferecem um método robusto e versátil para selecionar e manipular ficheiros e directórios de acordo com vários critérios, tornando-os particularmente benéficos em situações que envolvem estruturas de directórios intrincadas ou níveis exigentes de granularidade na seleção de ficheiros.

Para ativar critérios específicos de correspondência de padrões em um script Zsh utilizando o comando setopt , pode-se especificar uma extensão de arquivo específica de interesse para o diretório de trabalho atual. Para atingir este objetivo, basta executar o comando setopt seguido da extensão de ficheiro desejada, tal como .txt , permitindo assim o reconhecimento e processamento de ficheiros de texto com esse sufixo no contexto do diretório atual.

 setopt extended_glob
txt_files=(*.txt)

" .jpg\ -not *.log". Isto seleccionará todos os ficheiros que tenham uma extensão “.jpg” ou “.jpeg” e que não possuam uma extensão “.log” correspondente.

 setopt extended_glob
non_log_files=^(*.log)

De modo a utilizar padrões de globbing estendidos dentro da shell Bash, é necessário ativar esta funcionalidade empregando o comando “shopt” juntamente com a opção “extglob”. Para ilustrar, se alguém deseja identificar e processar todos os ficheiros que terminam em “.txt” localizados no atual diretório de trabalho, deve introduzir o seguinte código:

 shopt -s extglob
txt_files=(*.txt)

Para excluir ficheiros com uma extensão de ficheiro “.log” de serem correspondidos, pode utilizar o seguinte padrão de expressão regular no seu comando grep:css[^. ]\*\.log$Isto irá procurar qualquer cadeia de caracteres que não comece com um ponto final (ou seja, não é um nome de ficheiro terminado em “.log”), seguido de “\.log”. Isto corresponde a qualquer substring de caracteres que termine com “.log”, o que deve incluir a maioria dos ficheiros de registo mas excluir outros tipos de ficheiros de texto ou directórios.

 shopt -s extglob
non_log_files=!(*.log) 

Em termos de correspondência de padrões glob, existe uma distinção chave entre o Zsh e o Bash em relação aos respectivos comandos utilizados para ativar estes padrões. Deve-se notar, entretanto, que certos operadores empregados por cada shell podem variar.

Expansão avançada de parâmetros

O Zsh oferece a capacidade de expansão indireta de parâmetros, que permite a avaliação de uma variável cujo nome está contido noutra variável. Para realizar esta operação, é necessário preceder o nome da variável com um ponto de exclamação, denotado por “!”.

 name="foo"
result="${!name}"
echo "$result"

O Bash não suporta inerentemente expansões indirectas de variáveis. No entanto, existem soluções alternativas disponíveis, tais como a utilização do comando incorporado eval ou a utilização da sintaxe ${!variable} para obter referência indireta de variáveis.

 name="world"
var="name"
echo ${!var} # This will output: world

Semelhanças entre o Bash e o Zsh

Apesar das distinções que existem entre o Bash e o Zsh, também podem ser observadas certas semelhanças entre eles.

Sintaxe da linha de comando

O Bash e o Zsh empregam uma estrutura análoga para suas interfaces de linha de comando, o que facilita a interoperabilidade perfeita entre eles. Consequentemente, a maioria das directivas e sequências de scripts podem ser executadas em ambas as shells sem necessidade de ajustes. O facto de o Zsh ser construído sobre a base do Bash implica que incorpora todas as capacidades e funções fundamentais.

Embora possa haver algumas ligeiras discrepâncias na estrutura gramatical que requeiram atenção, é importante considerá-las cuidadosamente e tratá-las em conformidade.

Consistência da substituição de comandos

A substituição de comandos é uma técnica utilizada na execução de comandos em que o resultado ou saída de um comando é incorporado como um argumento noutro comando, assegurando a uniformidade em diferentes ambientes de shell.

 result=$(ls)

Tanto o Bash como o Zsh fornecem uma funcionalidade semelhante ao permitir a utilização da sintaxe $(comando), que permite a substituição da saída de um comando numa variável. Esta caraterística facilita a interoperabilidade perfeita entre os dois tipos de shell, mantendo a compatibilidade de scripts em diferentes plataformas.

Opção de depuração de scripts

Tanto o Bash como o Zsh utilizam a flag -x para facilitar a depuração de scripts. Ao executar um script usando esse sinalizador, ele exibirá cada comando antes de sua execução. Isto permite aos utilizadores detetar quaisquer discrepâncias nos seus scripts.

 # Debugging a script in both Bash and Zsh
#!/bin/bash -x

echo "Debugging Bash script"

A utilização da flag -x neste script Bash serve para facilitar as operações de depuração. Esta funcionalidade também pode ser replicada num contexto Zsh substituindo bash por zsh , incorporando assim os seus benefícios neste último ambiente de shell.

Considerações para escolher entre o Zsh e o Bash

A prevalência do Bash como a shell predefinida em numerosas plataformas baseadas em Unix confere-lhe um elevado grau de compatibilidade e transportabilidade, tornando-o uma seleção mais segura para esforços de scripting multi-sistema que necessitem de modificações mínimas em diversas arquitecturas de hardware.

O Zsh oferece um conjunto de capacidades sofisticadas, como arrays associativos, padrões glob melhorados e opções de expansão de parâmetros complexas que simplificam os processos de scripting de alto nível. Esses atributos são particularmente benéficos para aqueles que exigem processamento superior de strings e complexidade estrutural em seus scripts.

Os shells Bash e Zsh possuem ambos comunidades prósperas, mas o último possui uma comunidade mais robusta e uma vasta gama de plugins e temas à escolha. Para aqueles que priorizam a personalização, isso pode representar um benefício substancial em favor do Zsh.

O Bash, sendo um shell intuitivo e amplamente usado, serve como uma porta de entrada acessível para aqueles que não estão familiarizados com scripts de shell. A sua documentação abundante e os materiais orientados para principiantes simplificam o processo de apreensão dos conceitos fundamentais neste domínio.

Automatizando tarefas usando scripts de shell

A utilização adequada de linguagens de script para agilizar processos através da implementação de scripts de shell tem um valor significativo. Ao mecanizar tarefas recorrentes, uma quantidade substancial de tempo pode ser conservada.

Para além de gerir contas de utilizadores, monitorizar recursos do sistema, fazer cópias de segurança de dados e efetuar manutenção de rotina, estes scripts podem ser utilizados para minimizar a probabilidade de supervisão humana.