ti-enxame.com

Quais são as diferenças fundamentais entre os shells mainstream * NIX?

Quais são as diferenças fundamentais entre os shells mainstream * NIX e quais cenários podem solicitar que você use um sobre o outro? Entendo que parte disso provavelmente se resume à preferência do usuário, mas eu só usei o bash e estou interessado em saber onde outro Shell pode ser útil.

Além disso, há um impacto nos scripts do Shell gravados pelo usuário ao executar sob um Shell ou outro ou é simplesmente uma questão de alterar o Shell na parte superior do arquivo? Meu instinto diz que não é tão fácil.

52
conorgriffin

Para uso interativo, existem dois candidatos principais: bash e zsh , mais o retardador tcsh e o novato fish .

  • O Bash é o Shell oficial do projeto GNU e o Shell padrão na maioria das distribuições Linux. Em outras unidades que não são fornecidas com um Shell interativo decente como parte da instalação básica, acho que o bash é o que as pessoas tendem a escolher, em um loop de auto-reforço “bash está em toda parte, então eu vou usá-lo também.” Veja também Por que a bash está em toda parte? (com muitas informações históricas).

  • O Zsh possui quase todos os recursos do bash e muitos outros recursos (úteis!). Sua principal desvantagem é ser menos conhecido, o que, na prática, significa que é menos provável que você o encontre já instalado em um sistema que alguém configurou e que há menos documentação de terceiros. Veja também Quais recursos do zsh você usa? , Quais recursos estão no zsh e estão ausentes no bash ou vice-versa? .

  • O Tcsh já foi (até o início dos anos 90) o Shell com os melhores recursos interativos, como o seu predecessor csh. Isso o tornou popular para uso interativo (mas não para scripts ). O Zsh alcançou o tcsh e melhorou bastante rapidamente, e o bash alcançou (com conclusão programável) no início dos anos 2000, enquanto o tcsh mal progrediu nos últimos 15 anos. Portanto, há poucas razões para aprender o tcsh agora.

  • O peixe tenta ser mais limpo que seus antecessores. Ele tem alguns recursos interessantes (sintaxe mais simples, sintaxe colorida na linha de comando), mas não possui outros (o que o autor não gostar). A comunidade de peixes é muito menor que a do zsh, tornando os efeitos ainda mais agudos.


Para scripts, existem vários idiomas que você deseja segmentar, dependendo de quão portátil você deseja que seus scripts sejam.

  • Qualquer coisa que fingir ser semelhante ao Unix tem um Shell derivado Bourne - como /bin/sh. Ainda existem algumas unidades comerciais em torno das quais /bin/sh Não é POSIX compatível.

  • Quase todo unix em execução no momento tem um executável sh que é pelo menos compatível com pelo menos POSIX.2-1992 e, geralmente, pelo menos POSIX: 2001 também conhecido como Single Unix v . Esse Shell pode estar em um diretório diferente, como /usr/bin/posix Ou /usr/xpg6/bin. As camadas de emulação POSIX também existem para praticamente todos os sistemas poderosos o suficiente para suportá-lo, tornando-o um alvo atraente.

  • Muitos sistemas unix têm ksh9 , o que traz alguns recursos muito úteis que o POSIX sh não possui (matrizes, matrizes associativas, globs estendidos (*(foo), @(foo|bar),…) , globs nulos (~(N)foo*),…). Ksh era inicialmente um software comercial (tornou-se gratuito em 2000, após alguns hábitos terem se estabelecido)) e muitos unices gratuitos (Linux, * BSD) adquiriram o hábito de fornecer apenas um clone livre muito mais antigo ( pdksh ) sem muitos desses recursos úteis. O Pdksh agora está sendo deslocado por mksh fora do OpenBSD, mas até o mksh não consegue implementar todos os recursos do ksh93. Hoje, você pode conte com o ksh93 disponível em todos os lugares, especialmente no Linux, onde o bash é a norma.

  • Bash está sempre disponível no Linux (exceto algumas variantes incorporadas) e frequentemente em outros departamentos. Possui a maioria dos recursos úteis do ksh93, embora algumas vezes com uma sintaxe diferente.

  • Zsh possui a maioria dos recursos úteis do ksh93 e do bash. Sua sintaxe principal é mais limpa, mas incompatível com Bourne. Exceto pelo macOS, não conte com o zsh disponível em um sistema que você não instalou.

  • Para scripts mais avançados, você pode ativar para Perl ou Python . Essas linguagens têm estruturas de dados adequadas, recursos decentes de manipulação de texto, combinação decente de processos e mecanismos de comunicação e toneladas de bibliotecas disponíveis. A maioria dos sistemas unix os possui, junto com o sistema operacional ou instalados pelo administrador (porque existem tantos scripts Perl e Python por aí) que é um sistema raro que não possui pelo menos um De cada).

52

Existem dois tipos básicos de Shell, sh (por exemplo, bash) e csh (por exemplo, tcsh). Para uso interativo, tudo se resume ao que você está acostumado. Eu uso csh, e depois tcsh, há anos e seria doloroso mudar, só porque estou acostumado a isso. Também usei o bash e acho que não há razões convincentes para mudar. Exceto, talvez, se um ou outro não estiver disponível nas máquinas que você usa regularmente.

Para a programação, a sintaxe é diferente. Você não pode simplesmente mudar o Shell, mas também precisa alterar a sintaxe do script. Para scripts, você deseja usar sh ou bash. A sintaxe é muito mais acessível ao script, conforme explicado aqui (graças a Riccardo Murri pelo link. É um bom guia no script do bash .

Se você não decidiu um Shell e espera escrever alguns scripts, eu usaria o bash apenas para reduzir a quantidade de coisas que você precisa aprender.

27
KeithB

Nos velhos tempos, quando a AT&T inventou o UNIX, havia Bourne Shell, escrito por Steve Bourne. Era bastante básico e carecia de muitas ferramentas que nós damos como certas hoje em dia.

A AT&T não estava realmente no negócio do UNIX, então, nesse momento, o sistema operacional muito básico foi adotado por Berkelely, e eles fizeram algumas alterações no BSD UNIX. Entre muitas mudanças, havia um novo Shell, chamado csh, que teve muitas melhorias em relação ao sh, incluindo controle de tarefas, melhor uso interativo e assim por diante. Infelizmente, eles decidiram que a sintaxe da programação sh era péssima e criaram os seus próprios (um tanto mal) copiados dos estilos de codificação C. (Um discurso clássico é http://www.faqs.org/faqs/unix-faq/Shell/csh-whynot/ ) Portanto, agora havia duas sintaxes.

Mais tarde, eles fizeram melhorias no CSH, adicionando a conclusão de guias e outras coisas. Isso se tornou tcsh e, se você usa CSH, provavelmente é esse que você usa.

A AT&T decidiu que não estava totalmente fora dos negócios do UNIX, e eles o aprimoraram também. David Korn (Cara legal) criou o Korn Shell. Com base na idéia de estender a sintaxe do Bourne Shell, adicionou muitas coisas para programadores e uso interativo. Na verdade, existem algumas versões e você raramente vê coisas como ksh88 e ksh93, denotando as variantes.

Então veio a FSF e o sistema operacional GNU. Eles queriam criar seu próprio sistema operacional compatível com UNIX chamado Hurd, e queriam um Shell melhor para isso. Eles chamaram bash, para Bourne Again Shell. Regras do POSIX chegaram nessa época e eles queriam fazer o Shell POSIX.Eles olharam em volta, pegando a sintaxe do Bourne Shell e as melhorias do Korn Shell , além de roubar e estender os recursos interativos do tcsh, que se tornou o Shell de fato no Linux, por isso é muito comum.

Há também o zsh, escrito para ser o 'ultimate' Shell. Também é muito comum no mundo Linux. Ele estendeu o bash (e polinizou um pouco um pouco, algumas coisas novas voltaram ao bash).

Se eu fosse escolher um Shell, eu escolheria bash ou zsh. possivelmente o bash está em mais alguns lugares que o zsh. O zsh é mais poderoso, mas o bash tem sido bom para mim. O Bourne Shell real/bin/sh está disponível apenas por razões históricas. O bash tem praticamente tudo o que o ksh tem a oferecer e muito mais. A sintaxe é mais limpa que csh ou tcsh e possui recursos melhores que qualquer um deles.

Converter um script depende de o que para quê. O estilo Bourne Shell (sh, ksh, bash, zsh) para ou do estilo csh (csh, tcsh) será difícil. Passar do antigo para o mais recente (/ bin/sh => bash,/bin/ksh => zsh) será mais fácil do que o contrário.

12
Rich Homolka

Os dois principais ramos das cascas são os derivados Bourne Shell (sh, bash, ksh, ash, yash e zsh) e os derivados csh (tcsh e ... uhm ... tcsh).

Eu suspeito (embora eu não tenha números reais) que o bash é o mais amplamente usado, parece ser o Shell padrão na maioria dos linuxes.

A maioria das coisas escritas em um derivado da Shell provavelmente funcionará em outros. A maioria das coisas escritas em um Bourne Shell provavelmente precisará ser modificada para ser executada em csh ou tcsh.

Pessoalmente, usei o ksh quando comecei, porque era isso que estava no sistema que eu estava usando. Eu uso principalmente o bash agora.

8
mazianni

Eu usei várias conchas ao longo do tempo. Não é nada super avançado, mas muitas coisas práticas sobre sysadmin e programação que exigiram personalização suficiente.

Eu acho que o zsh tem mais opções de personalização, pelo menos costumava ter, mas depois de usá-lo por alguns anos, eu tive o suficiente com seus problemas de estabilidade e codificação de caracteres. O Bash é sólido, nunca teve problemas semelhantes e está instalado em qualquer lugar.

1
Ari T