Todos os scripts bash são compatíveis com o `zsh`?

63

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?

chrisjlee
fonte
Eu encontrei este útil: askubuntu.com/questions/1577/moving-from-bash-to-zsh
chrisjlee

Respostas:

55

Se seus scripts começarem com a linha, #!/bin/basheles 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.

Huygens
fonte
1
Qual foi a parte mais desafiadora de mudar?
Chrisjlee # 8/12
4
Nenhum. Meus scripts pessoais adicionam a referência adequada ao bash e eu tinha encontrado um bom .zshrc para começar. O Zsh e o bash eram bastante semelhantes que eu realmente não achei desafiador.
Huygens
4
você pode listar o seu .zshrc:)
neaumusic
Mas se a linha #!/bin/bashserá ignorada se estiver executando o arquivo de script como source ./script.sh?
LCB 13/06
3
Codificar o caminho para o shell é um mau conselho, mesmo que seja feito com freqüência. Em #!/usr/bin/env bashvez 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.
Konrad Rudolph
29

O Zsh pode executar a maioria dos scripts Bourne, POSIX ou ksh88 se você o colocar no modo de emulação correto ( emulate shou 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 .bashrcpara .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 .bashrcou .zshrce 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 shvez de emulate kshestar 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.

Gilles 'SO- parar de ser mau'
fonte
1
O shell que você usa é irrelevante se você executar seus scripts como ./my_script.sh. source my_script.she . my_script.shexecutará como o shell atual, ignorando qualquer shebang.
usar o seguinte
3

Se o shebang for #!/bin/bashe você iniciar o script, ./scriptele será executado pelo bash. Absolutamente não há problema aqui.

No entanto, se você executá-lo zsh ./scriptou fornecê-lo . ./scriptpara 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 promptno 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:

  1. Pro zsh

    • É muito bom poder ver as opções de sintaxe de comando pressionando uma guia.
    • Outro grande benefício do zsh é a correção de erros quando você digita um erro de digitação. Em vez de apenas exibir error: comando não encontrado, o zsh tentará interpretar o que você tentou digitar. O zsh aceitará essa entrada como um comando válido.
    • Além disso, o zsh possui muitos modificadores de expansão que permitem uma grande variedade de soluções. Como: liste apenas arquivos: 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 -- *(/)) .
    • Aceite matemática com carros alegóricos (com algumas ressalvas).
  2. Con zsh:

    • Bash é o shell padrão em muitos outros sistemas.
    • Muitas opções do zsh não ajudam diretamente a escrever scripts compatíveis com o bash.
    • Pode até se tornar um grande problema ao tentar aprender duas conchas ao mesmo tempo.

No final, a escolha é sua e, eu sempre gosto de mais opções.

Isaac
fonte