Eu estou olhando para mudar de bash para zsh, mas preocupado com a compatibilidade de scripts bash.
Todos os scripts / funções do bash são compatíveis com o zsh? Portanto, se isso é verdade, o zsh é apenas uma melhoria para o bash?
Eu estou olhando para mudar de bash para zsh, mas preocupado com a compatibilidade de scripts bash.
Todos os scripts / funções do bash são compatíveis com o zsh? Portanto, se isso é verdade, o zsh é apenas uma melhoria para o bash?
Respostas:
Se seus scripts começarem com a linha, #!/bin/bash
eles ainda serão executados usando o bash, mesmo que seu shell padrão seja zsh.
Eu encontrei a sintaxe do zsh muito próxima da do bash e não prestei atenção se havia realmente algumas incompatibilidades. Eu mudei há 6 anos do bash para o zsh sem problemas.
.zshrc
:)
#!/bin/bash
será ignorada se estiver executando o arquivo de script como source ./script.sh
?
#!/usr/bin/env bash
vez disso, você deve usar , especialmente no macOS, onde o bash padrão está severamente desatualizado e as novas versões são praticamente sempre instaladas em um caminho diferente.
O Zsh pode executar a maioria dos scripts Bourne, POSIX ou ksh88 se você o colocar no modo de emulação correto ( emulate sh
ou emulate ksh
). Ele não suporta todos os recursos do bash ou ksh93. O Zsh possui muitos recursos do bash, mas em muitos casos com uma sintaxe diferente.
O shell que você usa interativamente é irrelevante para qualquer script que você tenha. O shell que executa os scripts é o indicado na primeira linha, a linha shebang . Por exemplo, se o script começar #!/bin/bash
, ele será executado pelo bash.
Se você personalizou o bash, não poderá renomear seu nome .bashrc
para .zshrc
. Algumas coisas podem ser compartilhadas, por exemplo, aliases e funções, desde que você mantenha a interseção entre as duas conchas (a interseção fica próxima de ksh88 e pdksh ). Outras coisas, como configurações de prompt, funções de conclusão e a maioria das opções, precisarão ser reescritas completamente.
Se você está escrevendo um snippet para as pessoas obterem a partir deles .bashrc
ou .zshrc
e não deseja manter duas versões, siga um subconjunto comum de recursos do bash e zsh, que inclui a maioria dos recursos de programação do bash. Coloque todo o código em funções e coloque a seguinte linha na parte superior de cada função:
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
Você pode usar em emulate sh
vez de emulate ksh
estar mais próximo da sintaxe sh simples, que é o que você precisa .profile
.
Se uma função chama outra função, a outra função herda a configuração de emulação; portanto, você não precisa colocar essa linha em funções internas, apenas em funções chamadas pelo usuário final.
./my_script.sh
. source my_script.sh
e . my_script.sh
executará como o shell atual, ignorando qualquer shebang.
Se o shebang for #!/bin/bash
e você iniciar o script, ./script
ele será executado pelo bash. Absolutamente não há problema aqui.
No entanto, se você executá-lo zsh ./script
ou fornecê-lo . ./script
para a instância zsh em execução, é bastante comum que a sintaxe do bash e do zsh não corresponda.
Por exemplo, o zsh não divide expansões de parâmetros por padrão, o bash tem uma ajuda embutida, não há read -p prompt
no zsh (a sintaxe é muito diferente, leia o , arrays start on 1 (not 0) in zsh,
comando cmd \? Prompt prompt only search for external commands in zsh, or there is no (simple) equivalent to
$ {foo ^} `(primeiro caractere apenas em maiúsculas) no zsh , entre outros.Esta é uma longa lista de (principalmente) semelhanças e algumas diferenças .
Em alguns casos, pode-se dizer ao zsh para emular outras conchas. Em alguns casos, não há sintaxe comum portátil para os dois shells possíveis (sem o uso de aliases ou funções para emular soluções portáteis).
No entanto, o zsh possui muitas (muitas) extensões que facilitam o trabalho interativo. Essa é ao mesmo tempo um excelente motivo para mudar e um problema:
ls *(.)
(o que é difícil com outras conchas). Mesmo que, ao olhar com profundidade suficiente, a resposta se torne também complexa em zsh ( print -rl -- *(/)
) .Con zsh:
No final, a escolha é sua e, eu sempre gosto de mais opções.