Recursos exclusivos do bash em comparação com o zsh

67

Eu sou um usuário do zsh há algum tempo (antes desse tcsh e antes desse csh). Estou muito feliz com isso, mas fiquei imaginando se existem recursos interessantes do bash que não existem no zsh. Por outro lado, existem recursos zsh que não existem no bash. Minha sensação atual é que o bash é melhor:

  • Se você já conhece e não quer aprender nova sintaxe.
  • Por padrão, ele existe na maioria das máquinas * nix, enquanto o zsh pode ser uma instalação extra.

Não estou tentando iniciar uma batalha religiosa aqui, e é por isso que estou apenas procurando por recursos que existem em apenas uma das conchas.

Tim
fonte
10
Como os recursos exclusivos de um ou de outro são subjetivos? Sinceramente, não estou à procura de uma guerra de chamas e pretendo que a familiaridade de uma ou de outra seja uma boa razão para preferir essa concha.
Tim

Respostas:

40

zsh é para vulcanos. ;-)

Sério: o bash 4.0 tem alguns recursos anteriormente encontrados apenas no zsh, como ** globbing:

% ls /usr/src/**/Makefile

é equivalente a:

% find /usr/src -name "Makefile"

mas obviamente mais poderoso.

Na minha experiência, a conclusão programável do bash é um pouco melhor que a do zsh, pelo menos em alguns casos (completando pacotes debian para o aptitude, por exemplo).

bash tem Alt + .que inserir!$

zsh has expansion of all variables, so you can use e.g.

% rm !$<Tab>

for this. zsh can also expand a command in backtics, so

% cat `echo blubb | sed 's/u/a/'`<Tab>

yields

% cat blabb

I find it very useful to expand rm *, as you can see what would be removed and can maybe remove one or two files from the commmand to prevent them from being deleted.

Also nice: using the output from commands for other commands that do not read from stdin but expect a filename:

% diff <(sort foo) <(sort bar)

From what I read bash-completion also supports completing remote filenames over ssh if you use ssh-agent, which used to be a good reason to switch to zsh.

Aliases in zsh can be defined to work on the whole line instead of just at the beginning:

% alias -g ...="../.."
% cd ...
0x89
fonte
8
No bash, C-M-epara "shell-expand-line", que seria expandido cat `echo blubb | sed 's/u/a/'` para cat blabbe echo $SHELLpara o echo /bin/bashmeu caso. Além disso, C-x *para "glob-expand-word", que seria expandido rm *.
Victor Victor
16

Gostaria de salientar que o bash não é instalado por padrão no FreeBSD, OpenBSD ou NetBSD, e também não é instalado por padrão no Solaris 10 (o OpenSolaris o tem como padrão), da última vez que usei o AIX, ou Servidores HP-UX, também não foi instalado por padrão.

Além disso, no OpenSolaris / bin / sh NÃO é o bash. É ksh. Os maiores problemas que tenho como portador de software são pessoas que assumem que o / bin / sh é bash e que ele aceita a sintaxe estendida do bash. Embora esse pareça ser o caso na maioria das distribuições Linux, não é o caso em outros lugares e é realmente irritante.

X-Istence
fonte
6
Sim você está certo. Infelizmente, todos esses fornecedores facilitam muito a instalação do bash como um pacote extra. +1 para apontar a necessidade do purismo / bin / sh nos scripts.
kubanczyk
@kubanczyk: Se você está trabalhando em máquinas às quais não tem acesso root, pode não ser tão fácil de instalar, por isso acho que o ponto de vista do X-Istence permanece. (Eu trabalho em um monte de caixas Solaris, e os administradores de sistemas são todos viciados em ksh. Na última vez em que tentei compilar meu próprio software que não podia suportar (git neste caso), havia deficiências no compilador instalado, portanto, mesmo esse caminho foi cortado para mim).
iconoclasta
12

Embora eu seja um usuário do bash, acho muito interessante um dos recursos do zsh: RPS1.

Lembrar:

  • PS1: o prompt alinhado à esquerda
  • RPS1: o prompt alinhado à direita

Amostra:

Ao usar algo como

PS1=’%B(%h) %m%#%b 
RPS1=’(%20<…<%~)'

Você recebe sua solicitação à esquerda e o diretório atual pressionado à direita. Até desaparece quando a linha atual está ficando muito longa! É porque o zsh é inteligente o suficiente para dar baixa prioridade ao RPS1.

Você pode ver uma captura de tela deste exemplo em http://imgur.com/OAZhC .

Chucky
fonte
9

Zsh tem correção ortográfica. Se você receber uma carta (ou mais) de folga, ele entenderá o que você quis dizer.

Ele também possui uma conclusão de guia mais robusta, da qual eu gosto.

O Zsh possui um utilitário de configuração interativo para configurá-lo da maneira que desejar.

Alguns testes de velocidade dizem que o zsh é mais rápido, mas não notei nenhuma diferença.

Mago
fonte
11
Uma versão simplificada do dash que suporta apenas um subconjunto de seus recursos e projetada para ser usada em scripts que devem ser executados rapidamente (de inicialização, por exemplo) é dash.
Chucky
zshainda tem uma configuração para permitir erros de digitação com 'uma letra de fora' para o uso do teclado Dvorak.
vgoff
6

Não conheço nenhum recurso do bash que o zsh não suporte. O objetivo do design do zsh parece incluir o suporte a todos os recursos adicionados pelo bash.

Eu ainda uso o bash em vez do zsh. Eu raramente encontro recursos interessantes que o zsh suporta que o bash não. Problemas ocasionais com o zsh ao longo dos anos, ou ele não existe em certos sistemas, fizeram com que não valesse a pena fazer a transição.

Finalmente posso usar o mesmo shell em todos os sistemas Unix, não vale a pena quebrar isso por recursos que nunca vou usar.

Os recursos presentes no zsh que não estão presentes no bash parecem ser bonitos, mas não os que importariam no dia-a-dia.

Carlito
fonte
3

O bash possui muitos recursos que costumavam estar apenas no zsh. Você pode ter 'conclusão de guia inteligente' agora com o bash, como qualquer usuário recente do ubuntu descobriu.

Rory
fonte
1

Substituição de processo e globbing estendido são os dois recursos que eu mais sentiria falta. As configurações de prompt também são muito legais - ver o nível de aninhamento quando você digita instruções complexas nas linhas de comando. O carregamento automático torna viável a inclusão de muitas funções em cada shell.


fonte
Eu suponho que você quer dizer que sentiria falta dos do zsh, já que o AFAIK inclui tudo o que você mencionou no zsh? (Mas você tem certeza de que todos estão ausentes do bash? Isso me surpreenderia.) De qualquer forma, acrescentar isso tornaria sua resposta mais clara, pois há pessoas respondendo nos dois lados da cerca do bash / zsh. Além disso, seria útil se você desse exemplos de como cada um desses recursos facilita sua vida útil.
Iconoclast
0

Sou fã do zsh por causa do suporte ao modo vi, mas estou descobrindo que ele não é muito usado. Acho que li que o zsh gosta de pegar recursos populares de outros shells e combiná-los (para que coisas específicas do bash e específicas do csh estejam disponíveis no zsh).

Alguém também disse que estou flexionando meu fator nerd usando zsh, mas não posso confirmar ou negar esse boato.

Milner
fonte
5
e sim, o bash também possui suporte ao modo vi.
pjz
@ Miller: você pode explicar que tipo de suporte ao modo vi está no zsh que não está no bash? Se você simplesmente quer dizer a capacidade de configurar o -o vi na linha de comando, isso está claramente em ambos. Se houver algum suporte estendido no zsh, você poderia descrever claramente o que é e o que ele adiciona?
Iconoclast
-1

Popularidade, #bash 430 usuários. #zsh 123 usuários. Acredito que o site zsh tenha uma boa comparação do zsh com outros shells. O zsh possui melhor suporte ao modo vi.

Ian Kelling
fonte
2
Como é o modo vi no zsh melhor? Eu sou um usuário do bash e tenho o modo vi ativado, então gostaria de saber se há algum benefício em alternar.
Ptman 16/05/10
11
@ptman: o prompt do zsh pode ser feito para informar o modo (inserção / normal). O Readline não pode fazer isso. O prompter também é mais flexível: você pode destacar a sintaxe, etc!
Unperson325680
@progo: ahh! muito agradável. Agora só posso começar a usar o modo vi no zsh. Essa tem sido uma das minhas razões para continuar com o modo emacs até agora.
Iconoclast
@Brandon esse pequeno aprimoramento foi a razão de eu trocar de concha.
unid325680
-1

O Bash está usando a mesma sintaxe para if e while como isso pode ser usado em scripts / bin / sh na linha de comando.
Dentro do zsh, a sintaxe é diferente. Usando o zsh efetivamente, você precisa se lembrar de ambos, se estiver usando uma instrução if ou while na linha de comando

Michèle
fonte
11
Eu tentei isso, usando if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fia linha de comando e um script, e funcionou como esperado nos dois casos. Portanto, parece que você não tem seus fatos corretos.
Iconoclast
Isso depende do que você instalou como / bin / sh. Se / bin / sh for bash, você está certo. Caso contrário, o bash não tem essa vantagem. Se zsh for / bin / sh, o zsh terá essa vantagem. Dado todos os shells diferentes que poderiam fornecer / bin / sh, eu pessoalmente recomendo apenas usar o shell que você deseja para scripts de shell, para que sua ausência aponte para um problema com uma correção óbvia, em vez de comportamentos bizarros sem nenhuma pista sobre como resolver.
Ed Grimm