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

52

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? Eu 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 de 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.

Conorgriffin
fonte

Respostas:

52

Para uso interativo, existem dois concorrentes principais, bash e zsh , além do straggler tcsh e do newcomer fish .

  • Bash é o shell oficial do projeto GNU e o shell padrão na maioria das distribuições Linux. Em outros departamentos que não são fornecidos com um shell interativo decente como parte da instalação da base, acho que o bash é o que as pessoas costumam 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 o bash está em todo lugar? (com muita informação histórica).

  • 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 possui alguns recursos interessantes (sintaxe mais simples, coloração de sintaxe 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ê pode querer segmentar, dependendo de quão portátil você deseja que seus scripts sejam.

  • Qualquer coisa que fingir ser do tipo Unix tem um shell derivado de Bourne como /bin/sh. Ainda existem alguns departamentos comerciais onde /bin/shnão é compatível com POSIX .

  • Quase todo unix em execução no momento tem um shexecutável que seja pelo menos compatível com pelo menos POSIX.2-1992 e, geralmente, pelo menos POSIX: 2001, também conhecido como Single Unix v3 . Esse shell pode residir em um diretório diferente, como /usr/bin/posixou /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 ksh93 , que traz algumas características muito úteis que POSIX sh carece (matrizes, matrizes associativas, globs prolongados ( *(foo), @(foo|bar)...), null globs ( ~(N)foo*), ...). O Ksh era inicialmente um software comercial (tornou-se gratuito em 2000, após alguns hábitos terem se estabelecido), e muitos unices grátis (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 substituído pelo mksh fora do OpenBSD, mas até o mksh não consegue implementar todos os recursos do ksh93. Hoje, você não pode contar com o ksh93 disponível em todos os lugares, especialmente no Linux, onde o bash é a norma.

  • O 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.

  • O 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 usar Perl ou Python . Essas linguagens possuem 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, agrupados no 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).

Gilles 'SO- parar de ser mau'
fonte
4
Para scripts, eu viso o traço, (a menos que eu precise dos recursos avançados do bash), que possui um conjunto mínimo de recursos e é uma reclamação posix para compatibilidade máxima. (e é pequena luz e rápido)
Hildred
Great documentaion! Duas notas. Primeiro, o Solaris é um desses "departamentos comerciais onde o / bin / sh não é compatível com POSIX". Especificamente, ele usa jsh(que não é um shell de java!), Que não possui substituição de variáveis ​​como ${VAR#foo}e ${VAR%bar}.
Adam Katz
Em segundo lugar, tcshé bastante popular entre os usuários do UNIX que aprenderam seus truques antes dos ~ meados dos anos 90 (que viu a introdução de ambos bashe zsh), especialmente entre os + velhos UNIX Cdesenvolvedores, que começou a vida com csh(lembrete, o c em cshstands para a Clinguagem , que foi a inspiração para suas diferenças em relação às conchas no estilo bourne). Veja também a programação Csh considerada prejudicial , que eu costumo usar para obter dicas sobre a magia profunda do POSIX (além de seus argumentos anti-csh).
Adam Katz
O Mac OS X nunca é "OS / X". (: E como o zsh é incompatível com Bourne? (Bem, exceto por coisas como expansões de variáveis ​​que não
separam palavras
@seaturtle A expansão de variáveis ​​que não separam palavras é a principal diferença que quebraria muitos scripts sh se você tentasse executá-los com zsh (a menos que você execute zsh no modo de emulação sh / ksh).
Gilles 'SO- stop be evil' -
27

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 aos scripts, conforme explicado aqui (obrigado a Riccardo Murri pelo link. Este é um bom guia sobre scripts de bash.

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

KeithB
fonte
12

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 certa 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 tinha 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 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 o 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 shell Korn. Com base na idéia de estender a sintaxe do shell Bourne, 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.

Depois veio a FSF e o GNU OS. Eles queriam criar seu próprio sistema operacional compatível com UNIX, chamado Hurd, e queriam um shell melhor para ele. Eles chamaram bash, de Bourne Again SHell. As regras do POSIX chegaram exatamente nessa época e elas queriam criar o shell POSIX. Eles olharam em volta, pegando a sintaxe do shell Bourne e as melhorias do shell Korn, além de roubar e estender os recursos interativos do tcsh. Tornou-se o shell de fato no Linux, por isso é muito comum.

Há também o zsh, escrito para ser o shell 'final'. 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 shell Bourne 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 de shell Bourne (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.

Rich Homolka
fonte
Observe que a página csh-whynot foi escrita em setembro de 1995 (verifique a tag da versão na parte superior). Não sei, mas esperaria que muitas coisas mudassem nos 18 anos desde então.
a CVn 29/06/2013
8

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

Eu suspeito (embora 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 de uma casca de bourne provavelmente funcionará em outras. A maioria das coisas escritas em um shell Bourne 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 estava usando. Eu uso principalmente o bash agora.

mazianni
fonte
11
fish é um shell inspirado em csh
hildred
1

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.

Ari T
fonte