Mudando para 'zsh': Todos os scripts bash são compatíveis com 'zsh'?

44

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 for verdade, zsh é apenas um aprimoramento para o bash?

    
por chrisjlee 08.05.2012 / 22:02

3 respostas

42

Se seus scripts começarem com a linha #!/bin/bash , eles ainda serão executados usando o bash, mesmo que o shell padrão seja zsh.

Eu achei a sintaxe do zsh bem próxima da do bash, e eu não prestei atenção se houve realmente algumas incompatibilidades. Eu mudei 6 anos atrás de bash para zsh seemlessly.

    
por 08.05.2012 / 22:35
22

O Zsh pode executar a maioria dos scripts Bourne, POSIX ou ksh88 se você colocá-lo no modo de emulação correto ( emulate sh ou emulate ksh ). Não suporta todos os recursos do bash ou ksh93. O Zsh tem mais 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 com #!/bin/bash , ele será executado por bash.

Se você personalizou o bash, não será possível renomear seu .bashrc para .zshrc . Algumas coisas podem ser compartilhadas, por exemplo, aliases e funções, contanto que você mantenha a interseção entre as duas shells (a interseção é perto 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 completamente reescritas.

Se você estiver escrevendo um snippet para as pessoas acessarem de .bashrc ou .zshrc e você não quiser manter duas versões, atenha-se a um subconjunto comum de recursos bash e zsh, que inclui a maioria dos recursos do bash recursos de programação. Coloque todo o seu código em funções e coloque a seguinte linha no topo de cada função:

if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi

Você pode usar emulate sh em vez de emulate ksh para estar mais perto da sintaxe sh simples, que é o que você precisa para .profile .

Se uma função chama outra função, a outra função herda a configuração de emulação, então você não precisa colocar esta linha em funções internas, apenas em funções chamadas pelo usuário final.

    
por 09.05.2012 / 01:04
1

Mas, às vezes, há a incompetência e pode causar perigo (isso me deixou confuso na noite passada). Então apenas certifique-se de ter "#! / Usr / bin / env bash" na primeira linha.

Esta passagem vai ajudar muito. link

    
por 06.04.2013 / 02:53

Tags