Questão O que está em risco com a mudança para ZSH?


A maioria dos conselhos para o Mac é escrita supondo que você use o shell Bash. Se eu mudar para o zsh, como me tornarei incompatível com os scripts Bash atuais que tenho no meu sistema, e os conselhos que as pessoas da SU me dão?

O #!/bin/sh linha no início dos meus scripts ajuda?

Editar: Irrelevante para a questão é por que eu quero fazer isso. Melhor conclusão de tabulação. Acabei de experimentar o zsh colocando em um script de login como sugerido aqui e eu estou absolutamente encantada.


4


origem




Respostas:


A linha shebang que você mostra significa executar o script usando o shell Bourne (ou outro shell no modo de compatibilidade). Esses scripts provavelmente continuarão rodando usando o mesmo shell que eles estão agora se você mudar para o zsh como seu shell interativo. A única maneira que vai mudar é se você ligar sh para zsh, mas isso não deve mudar a funcionalidade.

Você encontrará uma certa quantidade de compatibilidade entre o zsh e o Bash quando usado como seu shell de login ou ao escrever scripts especificamente chamando um ou outro usando linhas shebang como:

#!/usr/bin/bash

ou

#!/usr/bin/zsh

No entanto, há muitas coisas que o zsh faz de maneira diferente ou que o Bash não consegue fazer. O Bash é muito mais usado, então há menos pessoas familiarizadas com as complexidades do zsh. Informações sobre isso estão amplamente disponíveis, no entanto. Além disso, você verá que há mais do que a ajuda adequada disponível aqui.

Você verá que, para escrever scripts, o shell é consideravelmente mais poderoso que o shell Bourne (sh), mas à custa da portabilidade. Além disso, como o Bash é mais usado que o zsh, seus scripts são relativamente mais portáteis.


4



Obrigado por isso. Você diz que "qualquer shell é consideravelmente mais poderoso que o shell Bourne". Você quer dizer bashou zsh como você mostra na linha shebang? - Dan Rosenstark
@ Yar: Sim, Bash e zsh (e até mesmo o shell Korn, especialmente o ksh93) têm mais recursos do que sh. - Dennis Williamson
Ok, quase todos os scripts de shell são escritos para o modo de compatibilidade. Eu não fazia ideia. Enquanto isso minha linha de shebang diz #!/usr/bin/env ruby na maior parte do tempo, mas eu uso muitas outras pessoas sh scripts. - Dan Rosenstark


Eu não sou um usuário zsh, mas pelo que eu li no SuperUser e em outros lugares, eu sempre tive a impressão de que seus fãs focam em seus recursos extras para uso interativo mais do que para scripting. A primeira frase da descrição de zsh no Site ZSHecoa essa ênfase nos recursos interativos: "O Zsh é um shell projetado para uso interativo, embora também seja uma poderosa linguagem de script."

Dito isto, se você está planejando mudar seu shell de login, você pode continuar a escrever seus scripts no bash. Como outra resposta apontou, os scripts do bash serão mais portáveis.

Scripts existentes com o explícito #!/bin/sh (ou #!/bin/bash ou qualquer outro caminho) continuará a funcionar bem, independentemente do seu shell de login.


4



Quando eu escrevo scripts por conta própria, eu uso Ruby :) boa resposta, obrigado! - Dan Rosenstark
Usar o zsh é incrivelmente conveniente. Escrevendo, não em todos. btw, o zsh age de forma diferente dependendo de como você o chama, ou seja, se / bin / sh é um link simbólico para / bin / zsh, então o zsh vai agir mais como / bin / sh - chiggsy


Aqui você encontrará uma lista de "bashisms", ou seja, pedaços de código que serão executados no shell bash mas não em outros shells compatíveis com bourne.

Se você deseja alcançar a portabilidade máxima ao escrever scripts de shell do que iniciar seu script com #!/bin/sh e evite "bashisms", para que ele seja executado em qualquer outro shell compatível com posix, como ksh ou zsh.


3



Obrigado, boa informação quando adicionado às outras respostas. - Dan Rosenstark


/bin/sh aponta para o bash, executando-o no modo de compatibilidade. A única coisa que altera suas alterações no shell de login é quais recursos internos estão disponíveis e como eles funcionam. Scripts seguem sua linha de shebang.


1



Deve-se notar que isso é verdade em alguns sistemas. Em outros, está ligado a dashou ash ou outros ou é mesmo o verdadeiro negócio Bourne shell em si. - Dennis Williamson
Sim. Mas a questão é marcada "osx". - Ignacio Vazquez-Abrams
Infelizmente, "anotado" é muito pequeno para ser um comentário sobre SU. - Dan Rosenstark


Por "mudar para zsh", suponho que você quer dizer uma das duas coisas:

  • você vai usar chsh (ou equivalente) para alterar seu shell de login para zshou
  • você irá configurar terminal (ou equivalente) para usar zsh como seu shell padrão.

A maioria dos programas shell (shell "scripts") incluirá "Shebang" / "hash-bang" linha. O shebang declara qual interpretador (shell) deve interpretar (executar) o programa que o segue.

Como várias outras respostas indicam, os programas shell que usam uma linha shebang não serão afetados pela seleção de shell de login do usuário, nem pelo shell interativo que é o pai ou pai-N de um programa shell lançado.

Se você estiver instalando uma nova versão zsh e incluí-lo no seu PATH, programas que usam um shebang como #!/usr/bin/env zsh vai usar essa nova versão (quando são iniciados com um PATH que coloca o novo zsh primeiro). Isso só pode causar problemas se alguma alteração incompatível tiver sido feita entre sua versão antiga / original zsh e o novo. Note que isso seria umzsh (inter-zsh(versão) problema, não o problema inter-shell sobre o qual eu suspeito que você está preocupado. Esta é geralmente uma categoria de erro muito menor do que se (por exemplo) você tentasse executar uma festança programa com ksh.

Não usar uma linha shebang não é inerentemente portátil entre os ambientes do usuário. O resultado de tentar executar um executável, não-binário O arquivo que não possui um shebang depende do ambiente (OS, shell, possivelmente shell de login e variáveis ​​de ambiente). Quando esse arquivo é executado no sistema Mac OS X 10.4, o comportamento varia de acordo com o shell que o executa. kshe festança ambos interpretam o arquivo em uma cópia bifurcada de si mesmos. zsh sempre passa para /bin/sh. Se algum programa tentasse exec diretamente, falharia com ENOEXEC (isso acontece dentro do shell, eles apenas "cobrem" por "executá-lo" de uma maneira alternativa). Eu tenho uma vaga lembrança de alguns sistemas antigos, mesmo tentando usar o shell de login do usuário nesta situação, mas minha busca rápida não mostrou nada de útil.

 Um arquivo não binário é um arquivo que o kernel não reconhece como um dos formatos de objeto binário suportados.


No que diz respeito à compatibilidade interativa, zsh suporta muito da sintaxe estendida de festança e ksh (algumas das opções if devem ser ativadas com shell, no entanto), muito do conselho de “shell” que você encontra no Super User funcionará muito bem zsh (mesmo que alguns deles sejam compostos de "bashisms"). Algumas coisas (ligações de edição de linha de comando, conclusão, exibições rápidas, etc.) são totalmente diferentes festança e ksh e exigirá sintaxe diferente para operações semelhantes.

  zsh tem um pouco de festança compatibilidade de conclusão, mas eu nunca tentei isso.


1



Ainda processando isso. +1 por enquanto :) - Dan Rosenstark
Ele funciona melhor (complemento de festa do zsh) do que o bash. - chiggsy