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.
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.
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:
É 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.
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.
fonte
.zshrc
:)#!/bin/bash
será ignorada se estiver executando o arquivo de script comosource ./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
ouemulate 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:Você pode usar em
emulate sh
vez deemulate 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.
fonte
./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 promptonly 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:
Pro zsh
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.
fonte