Melhor resposta
Esses são todos shells, e há muitos mais que você não mencionou. Qual você escolhe usar é uma questão de preferência pessoal.
O primeiro shell foi o Bourne Shell (ou sh) e era o padrão no Unix por um longo tempo. Então, uma derivação principal no Unix apareceu, e um novo shell foi criado do zero, chamado de C Shell (ou csh). O antigo Bourne Shell foi seguido pelo compatível, mas muito mais poderoso Korn Shell (ou ksh). Os shells disponíveis geralmente se enquadram em uma destas categorias: derivado Bourne / Korn Shell (bash), derivado C Shell ou clone (tcsh) ou “outro” (como zsh).
Existem muitos shells para escolha, e não apenas aqueles que você mencionou. GNU bash cai no campo Bourne / Korn Shell, e é o shell padrão em uma ampla variedade de variantes do Unix e do Linux hoje. Se você usou um terminal shell no Unix ou Linux, provavelmente foi este. Se você realmente quiser o Bourne Shell (sh), acredito que agora ele está disponível gratuitamente – mas geralmente é evitado por não ter recursos suficientes. O Korn Shell é compatível com versões anteriores e também é gratuito na forma de clones (mksh) e do original lançado recentemente (ksh).
Para C Shell, existe o tcsh, um clone expandido do csh original . Existem menos clones do csh porque o csh não foi visto como um caminho a seguir e não tem tantos usuários – no entanto, muitas versões BSD do Unix (como o FreeBSD e outros) usarão o csh como seu shell padrão.
Existem variantes que não são compatíveis com sh / ksh ou csh – mas tendem a ser shells de nicho. Meus favoritos neste espaço seriam o Scheme Shell (scsh) e o Plan 9 shell rc – mas eles nunca são instalados por padrão no Unix ou Linux e o primeiro é bastante grande. zsh também se enquadra nesta “outra” categoria.
Minha recomendação é três vezes: primeiro, tente o shell padrão em seu sistema – quase certamente GNU bash. O Bash está em toda parte e lê e executa programas Bourne Shell e Korn Shell sem incompatibilidades. Em segundo lugar, experimente cada um dos shells que realmente deseja (como zsh ou tcsh) e trabalhe com eles por um tempo e veja se eles atendem às suas necessidades. Finalmente, use apenas um que se adapte ao seu gosto.
Observe que você não tem que escrever scripts no shell que usa: Usei o C Shell interativamente, mas me recusei a programar nele (todos os meus scripts usavam o Korn Shell). Finalmente, um dia mergulhei no ksh e nunca olhei para trás.
Meus favoritos pessoais neste ponto são mksh (um clone do Korn Shell sem extensões) – ou GNU bash com compatibilidade total do Korn Shell – ou rc , o shell do novo sistema operacional Plan 9 que deveria ser um sucessor do Unix (embora isso não tenha se materializado).
Resposta
Melhor para quê?
Quais são os seus critérios?
Pessoalmente, sugiro bash porque é o padrão nos sistemas Linux e MacOS X e prontamente disponível em todas as outras formas de Unix e no MS Windows através do Cygwin e é o padrão para o Microsoft ™ Windows Services para Linux ” (Ubuntu bash camada / subsistema de suporte).
Basicamente, é o caminho de menor resistência se você vai operar muitos sistemas diferentes ao longo de muitos anos … e frequentemente estará acessando sistemas recém-re-criados ou novas instâncias lançadas com desvios mínimos da base do sistema operacional (como é comum para farms de servidores web / app em escala). É perto o suficiente do shell Korn que poucas pessoas encontrarão os casos extremos em que eles diferem na semântica. (A maioria dos usuários não notará a diferença entre clones de Bourne shell mínimos, como ash e traço e os recursos que bash adiciona, muito menos ser capaz de distinguir entre as diferenças entre ksh e bash .
zsh é provavelmente o mais poderoso e personalizável. É mais adequado para alguém que é realmente apaixonado por usar e personalizar seu shell. A desvantagem de usá-lo … com todos os seus aprimoramentos e personalizações … é que o usuário provavelmente achará frustrante voltar a usar algum outro shell quando depuração de problemas em sistemas onde zsh não foi (ainda) instalado – o que é algo que o pessoal de ops / sysadmins em ambientes modernos faz com bastante frequência.Também é bastante inconveniente ao trabalhar ou orientar colegas e tentar mostrar-lhes algo em seu prompt de shell ou compartilhar uma tela GNU ou sessão tmux com eles.
O shell Korn, ksh , é um shell melhor para scripts do que bash em alguns pequenos detalhes … mas não o suficiente para valer a pena buscá-lo, instalá-lo e configurá-lo em qualquer lugar.
ksh suportava “matrizes associativas” (hash / dicionários) por muitos anos antes de bash adicioná-las. (Ele só foi adicionado ao bash há alguns anos, ainda não está incluído nas versões que vêm com o MacOS X por padrão, por exemplo). Portanto, geralmente é melhor simplesmente não usar matrizes associativas em seus scripts de shell. Se você acha que deseja seus recursos, geralmente é melhor mudar para Python, Ruby, Perl, TCL / desejo ou qualquer uma de uma série de outras linguagens de script de uso geral . Simplesmente não há muito a ganhar mudando para um shell diferente (em termos de sobrecarga operacional) apenas por aquele recurso.
O mesmo pode ser dito de ksh Co-processos .
A única outra diferença notável é aquela que deve ser explicada. Considere o seguinte comando shell:
unset foo; echo bar | read foo; echo "$foo"
Isso é perfeitamente válido em qualquer shell compatível com Bourne. Mas ele se comportará de maneira diferente sob várias camadas. Ele emitirá a string “bar” (e uma nova linha) ou apenas a linha em branco.
bash fará o último, enquanto ksh e zsh serão executados da maneira anterior. A variável de shell “foo” será definida no shell atual. Na minha opinião, essa é a semântica preferida.
Mas este é um caso esquivo. Até onde eu sei, não é coberto pelas especificações Posix para o shell Unix; portanto, o fato de que o comportamento depende da implementação não é um bug. Isso é apenas algo que um especialista no shell deve estar ciente e testar ou contornar.
A razão para esse comportamento é que o operador de “tubo” no shell é uma comunicação entre processos mecanismo. O shell deve criar um subshell, que é um subprocesso executando sua própria cópia da memória do processo pai. No entanto, qualquer implementação pode analisar o comando e executar a parte antes (à esquerda) do símbolo de barra vertical no subshell (como feito por ksh e zsh ) ou depois (à direita) do tubo (como feito por bash, muito versões antigas de ksh (antes do lançamento de 1983?) e o shell Bourne mais antigo e muitos de seus clones, como ash e traço .
Um trabalho ao redor é usar o agrupamento de comandos para garantir que todos os comandos após o tubo estejam “no escopo” com o read integrado da seguinte forma:
unset foo; echo bar | { read foo; echo "$foo"; }
(A propósito, este exemplo expõe um bug sutil que existia em bash anterior a 1.4 e que foi corrigido posteriormente; o analisador usado para tratar {} caracteres e tokens ve ry muito parecido com o () (parênteses). Portanto, costumava tolerar deixar de fora aquele ponto-e-vírgula após meu echo “$ foo” – que era, tecnicamente, um desvio da especificação. O problema é que milhões de pessoas estavam usando bash e escrevendo scripts com base na suposição de que não precisavam terminar o comando antes de uma chave de fechamento – com um ponto-e-vírgula ou uma nova linha. Portanto, alguns desses scripts de shell antigos ainda exibem esse bug mais de uma década depois e há apenas um punhado de pessoas que conhecem o shell bem o suficiente para identificá-lo e corrigi-lo.
Quanto ao uso interativo, bash é claramente superior a ksh , mas provavelmente não está no mesmo nível de zsh para qualquer pessoa que se comprometer a aprender e usar personalizações e aprimoramentos profundamente complicados.
bash suporta preenchimento [Tab] programável e as bibliotecas GNU readline para controle extremamente flexível sobre atalhos de teclado, edição de linha de comando e acesso ao histórico de comando. ksh tem o comando fc (que bash também suporta) para o seu “comando de correção” – isto é, selecionar itens do seu histórico, colocá-los em seu editor de texto preferido e executar automaticamente o conteúdo desse arquivo temporário editado ao sair.
Mas bash suporta isso e seus próprios emacs ou vi acesso e edição de histórico e o antigo csh ! operadores (bang) também.
bash suporte vi edição modo ( set -o vi ) que era, se bem me lembro, o padrão em ksh 93. Mas bash padroniza para o modo emacs ( set -o emacs ). Além disso, é claro, também se pode usar o comando bash bind para vincular novamente qualquer teclas para qualquer uma de um grande número de funções de edição e manipulação de histórico ou em macros que se expandem em qualquer texto que você queira colocar em uma linha de comando.
Além disso, bash tem muitas variáveis de ambiente “mágicas” que podem fazer coisas que são quase inimaginavelmente sutis e complexas. Por exemplo, você pode definir a variável PROMPT\_COMMAND para executar um gancho personalizado sempre que bash for prestes a apresentar seu prompt. Então você poderia ter essa verificação para algum .dot\_file mágico e re-personalizar seu shell em execução com base em qual diretório você está, ou redefinir a string de prompt e as cores da tela do terminal com base na hora do dia, ou consultar algum site e executar automaticamente algum comando com base em … praticamente qualquer coisa.
(Usei esse gancho para ativar automaticamente ambientes virtuais Python simplesmente mudando para seu diretório de trabalho por exemplo).
Quando você considera tcsh (ou seu ancestral, csh ) então você está em um nicho. É comum ver scripts csh no campo de EDA (automação de design eletrônico). Mas isso é um acidente da história e a maioria das pessoas que trabalham nessa área não usa tcsh para seu uso interativo.
O peixes a concha também é um nicho. Eu nunca usei o suficiente para formar uma opinião sobre ele, e certamente é colorido o suficiente. Mas eu acho que vai ter uma fileira muito difícil de enxar antes de cultivar um séquito verdadeiramente generalizado. A menos que a Apple ™ comece a enviá-lo como o shell padrão para seus sistemas Mac ™, ele provavelmente está condenado a permanecer em seu nicho no futuro previsível.
Então, espero ter entendido. Não faz muito sentido perguntar “o que é melhor …” (de praticamente qualquer coisa onde existem alternativas razoáveis).
No caso de shells de comando Unix, as diferenças entre os shells compatíveis com Bourne são tão menores que apenas os especialistas podem distingui-los, e esses têm trade-offs e eventualmente se resumem a preferências bastante subjetivas. Tenho colegas que são apaixonados por suas configurações zsh e outros que simplesmente se importam. Eu estou em algum lugar entre ter me adaptado à escolha mais disponível.