it-swarm-pt.tech

Bash ou KornShell (ksh)?

Não sou novo no * nix, no entanto, ultimamente, tenho passado muito tempo no Prompt. Minha pergunta é quais são as vantagens de usar o KornShell (ksh) ou o Bash Shell? Onde estão as armadilhas do uso de um sobre o outro?

Procurando entender da perspectiva de um usuário, e não apenas de scripts.

59
user13158

Bater.

As várias implementações UNIX e Linux têm várias implementações diferentes do ksh no nível de fonte, algumas das quais são reais, outras são implementações do pdksh e algumas são apenas links simbólicos para algum outro Shell que possui uma personalidade "ksh". Isso pode levar a diferenças estranhas no comportamento de execução.

Pelo menos com o bash, você pode ter certeza de que é uma única base de código, e tudo o que você precisa se preocupar é com a versão (geralmente mínima) do bash instalada. Tendo feito muitos scripts em praticamente todos os UNIX modernos (e não tão modernos), a programação do bash é mais confiável na minha experiência.

46
j.e.hahn

A diferença entre Kornshell e Bash é mínima. Existem algumas vantagens em relação à outra, mas as diferenças são pequenas:

  • O BASH é muito mais fácil de definir um prompt que exibe o diretório atual. Fazer o mesmo em Kornshell é uma tolice.
  • Kornshell tem matrizes associativas e o BASH não. Agora, a última vez que usei matrizes associativas foi ... Deixe-me pensar ... Nunca.
  • O Kornshell lida com a sintaxe do loop um pouco melhor. Geralmente, você pode definir um valor em um loop Kornshell e disponibilizá-lo após o loop.
  • O Bash lida com a obtenção de códigos de saída dos tubos de maneira mais limpa.
  • O Kornshell possui o comando print, que é muito melhor que o comando echo.
  • O Bash tem conclusões de guias. Nas versões mais antigas
  • O Kornshell possui o comando r history que me permite executar rapidamente comandos antigos.
  • Kornshell tem a sintaxe cd old new que substitui old por new em seu diretório e CDs por lá. É conveniente quando você estiver em um diretório chamado /foo/bar/barfoo/one/bar/bar/foo/bar e você precisa cd para /foo/bar/barfoo/two/bar/bar/foo/bar No Kornshell, você pode simplesmente fazer cd one two e termine com isso. No BASH, você teria que cd ../../../../../two/bar/bar/foo/bar.

Eu sou um cara velho do Kornshell porque aprendi o Unix nos anos 90, e esse era o Shell preferido naquela época. Posso usar o Bash, mas às vezes fico frustrado com isso porque, por hábito, uso algum recurso menor que o Kornshell possui que o BASH não funciona e não funciona. Portanto, sempre que possível, defino o Kornshell como padrão.

No entanto, eu vou lhe dizer para aprender BASH. O Bash agora está implementado na maioria dos sistemas Unix e no Linux, e há simplesmente mais recursos disponíveis para aprender BASH e obter ajuda do que o Kornshell. Se você precisar fazer algo exótico no BASH, poderá acessar o Stackoverflow, postar sua pergunta e obterá uma dúzia de respostas em alguns minutos - e algumas delas estarão corretas !.

Se você tiver uma pergunta do Kornshell e publicá-la no Stackoverflow, terá que esperar por algum passado antigo que o hacker principal, como eu, acorde de sua soneca antes de obter uma resposta. E, esqueça de receber qualquer resposta se estiver servindo pudim na casa da velhice naquele dia.

O BASH é simplesmente o Shell de escolha agora; portanto, se você precisa aprender alguma coisa, também pode ir com o que é popular.

122
David W.

Sou um veterano da Korn-Shell, então saiba que falo dessa perspectiva.

No entanto, eu me sinto à vontade com o Bourne Shell, o ksh88 e o ksh93, e, no máximo, sei quais recursos são suportados. (Eu devo pular o ksh88 aqui, pois ele não está mais amplamente distribuído.)

Para uso interativo, leve o que for adequado às suas necessidades. Experimentar. Eu gosto de poder usar o mesmo Shell para uso interativo e programação.

Eu fui do ksh88 no SVR2 para o tcsh, para o ksh88Sun (que adicionou suporte significativo à internacionalização) e o ksh93. Eu tentei bash, e odiava, porque achatou minha história. Então eu descobri shopt -s lithist e tudo estava bem. (A opção lithist garante que as novas linhas sejam preservadas no seu histórico de comandos.)

Para programação Shell, recomendo seriamente o ksh93 se você quiser uma linguagem de programação consistente, boa conformidade com POSIX e bom desempenho, pois muitos comandos unix comuns podem estar disponíveis como funções internas.

Se você deseja portabilidade, use pelo menos os dois. E verifique se você tem um bom conjunto de testes.

Existem muitas diferenças sutis entre as conchas. Considere, por exemplo, a leitura de um pipe:

b=42 && echo one two three four |
    read a b junk && echo $b

Isso produzirá resultados diferentes em conchas diferentes. O korn-Shell opera oleodutos de trás para frente; o último elemento no pipeline é executado no processo atual. O Bash não suportava esse comportamento útil até a v4.x, e mesmo assim, não é o padrão.

Outro exemplo que ilustra a consistência: O comando echo, que foi tornado obsoleto pela divisão entre o BSD e o SYSV unix, e cada um deles introduziu sua própria convenção para não imprimir novas linhas (e outros comportamentos). O resultado disso ainda pode ser visto em muitos scripts 'configure'.

O Ksh adotou uma abordagem radical para isso - e introduziu o comando print, que realmente suporta os dois métodos (o -n opção do BSD e o final \c caractere especial do SYSV)

No entanto, para programação de sistemas sérios, eu recomendaria algo diferente de um Shell, como python, Perl. Ou dê um passo adiante e use uma plataforma como fantoche - que permite observar e corrigir o estado de conjuntos de sistemas inteiros, com boa auditoria.

A programação de shell é como nadar em águas desconhecidas, ou pior.

Programar em qualquer linguagem requer familiaridade com sua sintaxe, suas interfaces e comportamento. A programação do shell não é diferente.

28
Henk Langeveld

Este é um pouco de uma batalha Unix vs Linux. A maioria, se não todas as distribuições Linux, têm o bash instalado e o ksh opcional. A maioria dos sistemas Unix, como Solaris, AIX e HPUX, possui o ksh como padrão.

Pessoalmente, eu sempre uso o ksh, adoro a conclusão do vi e praticamente uso o Solaris para tudo.

4
Kristian

Para scripts, eu sempre uso ksh porque suaviza sobre pegadinhas .

Mas acho bash mais confortável para uso interativo. Para mim, o emacs encadernações de teclas e o preenchimento de guias são os principais benefícios. Mas isso é principalmente força de hábito, não há nenhum problema técnico com ksh .

4
Jon Ericson

Não tenho experiência com o ksh, mas usei o bash e o zsh. Eu prefiro o zsh ao bash por causa de seu suporte a globbing de arquivos muito poderoso, modificadores de expansão variável e conclusão mais rápida da guia.

Aqui está uma introdução rápida: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-Shell-youll-ever-need/

4
Chris AtLee

Minha resposta seria 'escolha uma e aprenda como usá-la'. Ambos são conchas decentes; provavelmente o bash tem mais sinos e assobios, mas ambos têm os recursos básicos que você deseja. Atualmente, o bash está mais universalmente disponível. Se você estiver usando o Linux o tempo todo, fique com ele.

Se você está programando, tentar manter um sh simples para portabilidade é uma boa prática, mas, com o bash disponível tão amplamente nos dias de hoje, esse conselho provavelmente é um pouco antiquado.

Aprenda a usar a conclusão e seu histórico do Shell; leia a página de manual ocasionalmente e tente aprender algumas coisas novas.

3
Incident

@foxxtrot

Na verdade, o Shell padrão é o Bourne Shell (sh). /bin/sh no Linux é realmente bash, mas se você deseja scripts de plataforma cruzada, é melhor seguir os recursos do Bourne Shell original ou escrevê-lo em algo como Perl .

3
Hank Gay

Por um lado, o bash tem conclusão de tabulação. Isso por si só é suficiente para me fazer preferir ao invés de ksh.

Z Shell possui uma boa combinação dos recursos exclusivos do ksh com as coisas legais que o bash fornece, além de muito mais coisas sobre isso.

2
Allen

Disponível na maioria dos sistemas UNIX, o ksh é compatível com o padrão, claramente projetado e bem arredondado. Acho que livros, ajuda no ksh são suficientes e claros, especialmente o livro O'Reilly. Bash é uma massa. Eu o mantenho como login root no Shell para Linux apenas em casa.

Para uso interativo, eu prefiro o zsh no Linux/UNIX. Eu executo scripts no zsh, mas testarei a maioria dos meus scripts, mas funciona no AIX ksh.

2
MeaCulpa