Por que o Bash está em todo lugar (na maioria, se não todas as distribuições Linux)?

50

O Bash é usado por padrão em todas as distribuições Linux que tentei, em vez de alternativas como o Z shell (zsh). Existe uma razão técnica ou histórica para isso?

hoju
fonte
1
Não é. No meu sistema FreeBSD, o tcsh é o shell padrão!
54
Seu sistema FreeBSD não é uma distribuição Linux.
8
Deus me livre que há alguma coerência entre distros ...
OMG Pôneis
4
Não, mas ele pertence a "qualquer lugar" :)

Respostas:

106

História (adquirida não por meio de pesquisa, mas por passar muito tempo saindo com o pessoal do Bell Labs):

  1. No começo (se você considera o começo como Unix Versão 7), era o shell Bourne. Steve Bourne foi o primeiro a mostrar que o shell que controlava a interação do usuário poderia ser um programa do usuário e não uma parte especial do sistema operacional. Um avanço histórico. O próprio shell era relativamente limpo para scripts, mas não possuía edição de linha de comando ou controle de tarefas. A Introdução de Bourne ao Shell Unix ainda é útil para usuários iniciantes hoje.

    Edit : Eu ignorei algumas "pré-histórias" de Ken Thompson e John Mashey, também de Multics. Tenho certeza de que Bourne estava ciente de todo esse trabalho (ele estava no mesmo laboratório, em 1127, na Bell Labs), mas a concha de Bourne era definitiva e o trabalho anterior teve pouca influência, exceto como interpretado por Steve Bourne. Por exemplo, embora Ken tenha posteriormente escrito o compilador do Plano 9 C e tenha sido muito influente no Plano 9, o artigo de Tom Duff sobre o shell do Plano 9 (rc) menciona apenas o shell de Bourne, e não o de Thompson.

  2. O shell é apenas um programa de usuário, para que qualquer um possa escrever um. Como a versão 7 Unix estava sendo criada em Nova Jersey, o Berkeley Unix estava sendo criado na Califórnia. Bill Joy em Berkeley escreveu csh, o shell C. Joy adicionou controle e histórico do trabalho e, posteriormente, edição da linha de comando, mas não estava ciente do trabalho de Bourne e, portanto, baseou sua linguagem no shell Thompson (que eu considerava "pré-histórico" no item anterior). A comunidade Unix adorava o controle do trabalho, mas também amava a linguagem de Bourne. Para uma polêmica não particularmente boa contra a linguagem csh, consulte Programação Csh considerada prejudicial . Por um tempo, muitas pessoas usavam cshinterativamente seus recursos de controle de tarefas e histórico, mas usavam os de Bourne shpara escrever scripts. Esta situação era menos do que ideal.

    Edit : Obrigado a DigitalRoss por me esclarecer a cronologia de csh. Desde que recebi minha educação de pessoas que se referem ao BSD como "a heresia de Berkeley", fiquei sem fatos.

  3. Dave Korn, da Bell Labs, fez uma brilhante reengenharia da concha Bourne para produzir a concha Korn (ksh). Era totalmente compatível com o shell Bourne, shmas fornecia uma carga de melhorias inestimáveis. kshtornou-se a base de um padrão POSIX e foi enviado com o software Sun. (Isso apesar do fato de Bill Joy ter deixado Berkeley para ajudar a fundar a Sun e ser um dos líderes de software.)

  4. Bell Labs e AT&T estupidamente falham em criar kshcódigo aberto. ksh88é amplamente utilizado, mas ter fontes não é legal. Certas pessoas se tornam tão viciadas que se tornam criminosas digitais.

    Edit : Isso foi realmente tão estúpido? Difícil de saber. Berkeley já estava dando o Unix, e outras empresas logo se seguiriam, mas ainda era a época em que o Corporate Masters acreditava em cobrar pelo Unix. Mas os resultados: a AT&T Unix está morta, depois de ter sido vendida para várias partes várias vezes. O BSD e seus derivados estão vivos e bem, mas essas coisas novas, chamadas "Linux" e "GNU", têm uma enorme fração de participação que antes pertencia ao Bell Labs.

  5. A Free Software Foundation faz uma implementação de "sala limpa", a partir do zero, de um shell POSIX, atualizando todas as idéias de Dave Korn, mais no estilo usual da FSF, adicionando novos recursos próprios, como a conclusão programável. Eles chamam de concha "Bourne again", ou bash.

  6. Em meados da década de 90 ksh93, a fonte aberta da AT&T , mas já é tarde para uma adoção generalizada. O contrato de licença é estranhamente fora do padrão. bashe kshdivergem, e kshnão consegue proporcional quota de mercado com o seu lugar na história.

Lições:

  • O primeiro produto adequado ao mercado vence (sh).

  • As pessoas adoram novos recursos (controle de tarefas, conclusão de comandos), mas as amam ainda mais quando seus scripts antigos continuam funcionando.

  • Edit : Professores de engenharia devem deixar a história para historiadores da ciência :-)

Norman Ramsey
fonte
Eu acho que você realmente tem a explicação mais completa e precisa para a popularidade do bash sobre todo o resto. Eu já vi ambientes que padronizam o zsh e os odeio porque toda a sintaxe está um pouco errada e não consigo descobrir ou cometo erros.
A bala (1) precisa de correção: antes da concha Bourne ser a concha Mashey e antes da concha Mashey ser a ur-Shell, a concha Ken Thompson. Veja en.wikipedia.org/wiki/Unix_shell
Jim Ferrans
2
Sem culpar Norman especificamente, há muitas imprecisões aqui. Ken Thompson escreveu o primeiro shell, que era o único shell através do V6 e estava em uso paralelo no V7 e 32V. Stephen Bourne não foi o "primeiro" escritor de shell, ele reescreveu o shell do KT. O Csh não tinha controle de trabalho até o 4.1BSD, embora tenha sido o primeiro shell a obtê-lo. O Csh não alterou nenhuma sintaxe do shell, ele era compatível com o shell V6, assim como o shell Bourne. Quase todo o código estava licenciado naqueles dias. O que exatamente era estúpido em cobrar taxas de licença pelo Unix?
DigitalRoss
2
Provavelmente não estou explicando isso muito bem, deixe-me tentar novamente. O Csh é anterior a Bourne , ou o mais tardar era uma implementação paralela a um continente de distância. (Antes da internet, isso importava.) Eu estava sentado ao lado de Bill Joy em Cory Hall, ocasionalmente, quando ele escrevia; Posso garantir absolutamente que ele escreveu na V6. Como eu disse, csh (e Bourne) são compatíveis com versões anteriores do V6-Thompson, pois era tudo o que existia quando os escreveram. Claro que não é Bourne-compatível, os talentos de AFAIK Bill Joy não incluiu ver o futuro
DigitalRoss
1
Não bashtomou a idéia da conclusão programável tcsh?
46

Bash tem duas coisas completamente diferentes.

  1. É uma concha fina. É um dos talvez 2 shells (o outro é o zsh) que integra alguns dos cshrecursos interessantes , como a !substituição do histórico na sintaxe posix. Tem muitas extensões, incluindo matrizes.

  2. É o shell FSF / GNU. No mundo do código aberto, isso oferece uma espécie de cache.

Devo acrescentar também que nem sempre é o padrão. ashé frequentemente usado como / bin / sh para que, embora bashpossa ser o shell interativo, ashseja o shell "basta executar o arquivo de comando". Isso ocorre porque ashé menor e mais rápido, e contém os recursos do posix, por isso é um subconjunto adequado. Usar ashcomo um shell interativo às vezes é problemático. No NetBSD, por exemplo, ele funciona bem, porque é construído com todos os recursos. É um tipo de shell único, enquanto bashé um pacote externo. Mas no Linux ashé geralmente considerado não interativo, então eles o compilam sem o histórico e sem a (importante) edição de linha na teoria de que ele é usado apenas para executar esses gnu configurescripts enormes .

Conto de duas conchas

A verdadeira história da concha

ATUALIZAÇÃO: Há um histórico impreciso do shell sendo copiado de um lugar para outro na Web, e as pessoas estão compreensivelmente acreditando nisso. Vou tentar fornecer uma versão precisa e fornecer alguns links para substancia-la aqui.

  1. O primeiro shell certamente não foi o Bourne, mas foi escrito pelo próprio Ken Thompson e distribuído na V6, que é a versão que a AT&T enviou a várias universidades e laboratórios do governo. Foi isso que colocou o Unix no mapa. Tinha tudo básico, <, >, >>, |, &mas tinha apenas uma gotosintaxe de controle simples através de um programa externo que buscava a entrada padrão. Não havia scripts shell complexos na época. Os shells posteriores abririam a entrada de comando em um fd separado. Pode parecer simples hoje, mas no filme de terror que era a computação dos anos 70, era a melhor coisa do mundo. Acredite ou não, esse shell antigo tem seu próprio fluxo no twitter hoje e, é claro, uma home page .
  2. A segunda camada foi csh, escrita (como foi vi) por Bill Joy na UCB. Isso aconteceu antes da GNU readline e do NetBSD editline, então deve ter parecido perfeitamente razoável fazer história com a !sintaxe. O Csh adicionou a maioria dos recursos de shell de hoje, mas com a sintaxe do csh. O csh não alterou nenhuma sintaxe , gratuitamente ou de outra forma. Ele era realmente compatível com o shell Thompson e originalmente incluía o código-fonte TS.
  3. O terceiro shell era o shell Bourne, com sintaxe diferente. O Unix estava sendo desenvolvido em paralelo na UCB e AT&T. Esta concha tinha um alocador de memória estranho (acho que acabou de usar mais memória, SIGSEGV preso, fez um novo brk (2), e depois tentou de novo) que tornava difícil para rodar em novos portos Unix, por isso oshe cshficou popular durante algum tempo . Não havia internet e o SW era licenciado, portanto, nesse ambiente, é possível que Stephen Bourne não soubesse do shell de Joy e certamente Joy não soubesse de Bourne. É possível que os dois cartuchos tenham se conhecido quando a UCB recebeu um VAX e um pré-lançamento do agora esquecido Unix / 32V . Lembro-me de Bill reclamando da alocação de memória. Observe que os dois shells eram compatíveis com o shell V6, eles simplesmente estenderam a sintaxe em diferentes direções.
  4. Agora realmente havia várias conchas incompatíveis, às quais a AT&T adicionou o compatível com Bourne ksh. Eventualmente, cshtinha código fonte semi-disponível, mas foi preso em um processo entre a AT&T e a Universidade da Califórnia . Ainda assim, esses foram os dias de glória do BSD Unix, pois empresas sofisticadas que podiam pagar a taxa de US $ 50.000 comprariam a licença da AT&T, mas instalariam as distribuições do BSD 4.x, e as universidades a adquiriam de graça.
  5. Nesta situação com muitas questões legais e técnicas, várias implementações independentes foram realizadas. Pelo menos tantos concordaram com a cshsintaxe quanto a sintaxe do shell Bourne, e alguns fundiram os dois. Você tinha, pelo menos tcsh, zsh, bash, e ash. A sintaxe Bourne era "oficial", fazendo parte dos lançamentos da AT&T, mas naqueles dias o BSD era bastante importante, e a Sun, inicialmente o BSD, distribuía uma quantidade razoável do SW Unix que o mundo encontrava.
  6. Em parte por causa do processo da USL, a FSF e o Linux tiveram um campo aberto. Enquanto isso, a AT&T havia conseguido brigar com uma das poucas entidades na Terra maiores do que eram (o estado da Califórnia) e, no final, não venceu o processo, e, por fim, a distribuição do BSD foi legalmente firmada. pé. Mas até então o Linux e o bash estavam por toda parte, e hoje o BSD é um nicho.
  7. Finalmente, o bash é uma boa concha (embora aparentemente renegado em particular pelo seu autor original) e merece totalmente o crédito por seu próprio sucesso. O csh teria sido ofuscado pelo tcsh e pelo zsh, mesmo que ash, bash e ksh não tivessem vencido a guerra de sintaxe.
DigitalRoss
fonte
Além disso, / bin / sh precisa estar vinculado estaticamente.
Se algo entrar /bine /sbindepender /usrdisso, está quebrado e precisa ser corrigido; eles devem depender apenas de bibliotecas no /lib. loginPrecisa apenas de PAM; a "API mais recente" que requer bibliotecas dinâmicas seria NSS. "Tendência para"? O NetBSD 2.0 já mudou para um totalmente dinâmico /bine /sbinhá 5 anos, o FreeBSD 5.2 ainda mais longo e o Linux ... bem, isso varia de acordo com a distribuição, mas isso já faz um bom tempo.
ephemient
2
Quero deixar bem claro que minha resposta é meu trabalho original; nenhuma palavra foi copiada de qualquer lugar.
Norman Ramsey
1
Claro, eu não quis dizer que você colou, apenas que há muita informação errada por aí e não queria lhe dar uma bronca por relatar uma história já incompreendida.
DigitalRoss
6

Para adicionar ao que @DigitalRoss disse

  • O Bash é um substituto completo do superconjunto para o posix-sh, mesmo que seja chamado como / bin / sh emulará totalmente o posix-sh. O Posix-sh era o "padrão" para sistemas unix comerciais como um shell denominador comum. Então, algo que começa lá e se baseia nele está começando muito.
dpb
fonte
4

Porque o Linux é apenas o Kernel (e o suporte necessário), enquanto o GNU fornece (ou forneceu) todos os clones básicos do software Unix que tornam o que chamamos de "Linux" utilizável. Bash é o shell do projeto GNU escrito como um clone do shell Bourne mais antigo (sh) do Unix Versão 7.

beggs
fonte
ele não está perguntando "por que há um programa shell"
Hasen
@hasen j: A pergunta é feita se existe uma razão histórica para todos os sistemas Linux que ele usou usarem como padrão o Bash como shell.
Beggs
2
@ hasen j: beggs não está respondendo "por que existe um programa shell"? Você perdeu o ponto da resposta, assim como todos os outros defensores da justiça obviamente.
1

De acordo com uma pesquisa do unix.com, não está muito longe do ksh.
/ bin / sh 83 8,96%
/ bin / csh 36 3,89%
/ bin / ksh 370 39,96%
/ bin / tcsh 36 3,89%
/ bin / bash 401 43,30%

HayekSplosives
fonte
0

O Bash é amplamente aceito devido ao seu rico conjunto de recursos. Ele também adota recursos de outras conchas, como cascas C e cascas Korn. Por favor, dê uma olhada neste conjunto de recursos.


fonte
0

Como 'bash' é 100% compatível com 'sh / ksh' e 'ksh' é o shell POSIX.

Portanto, se você deseja um sistema compatível com POSIX e está no Linux, usa o bash.

Se você está em um unix comercial, geralmente obtém o ksh como o shell padrão (em algum momento simplesmente sh antigo). Por alguma razão, a Sun ainda assume o padrão flakey csh c-shell.

A vantagem é a portabilidade que um .sh escrito para hp-ux ou AIX tem uma boa chance de executar como um 'bash' do linux sem nenhuma alteração.


fonte
kshnão é o shell POSIX . Não existe o shell POSIX . Existem shells que estão em conformidade com a especificação POSIX, que kshé uma das, mas de nenhuma maneira é a única.
0

E para adicionar a todas as outras respostas: zshnão é para ser compatível com versões anteriores. Você provavelmente pode configurá-lo para que seja compatível, mas depois está perdendo seus recursos.

Eu uso zshcomo meu shell interativo regular, mas bash/ me dashparece mais sensato como uma linguagem de script de shell; eles fazem menos mágica e são mais previsíveis ... isso é mais importante para mim quando escrevo um script que deve funcionar por vários anos.

liori
fonte
0

Apenas para confundir, o shcomando às vezes é apenas um link simbólico para outro programa shell, como ash, bashou dash.

O Ubuntu costumava vinculá-lo bash, pois bashé projetado para executar qualquer script de shell Bourne compatível.

Recentemente, porém, o Ubuntu mudou para o shlink para dash. dashfoi projetado para executar bashscripts (e, portanto, também shscripts), mas foi projetado para ser usado apenas para scripts, portanto, carece dos recursos interativos do bash. Isso o torna menor e (talvez) mais rápido.

Conta
fonte