Quais recursos estão no zsh e estão ausentes no bash ou vice-versa?

62

Como usuário do Linux, sempre usei o bash porque era o padrão em todas as distribuições que eu usava. Pessoas que usam outros sistemas Unix, como o BSD, parecem usar outros shells com muito mais frequência. No interesse de aprender um pouco mais, decidi experimentar o zsh.

Como usuário bash:

  • Quais recursos vou sentir falta?
  • E quais devo procurar?
Macha
fonte
5
@Gilles um dia que poderia ser bom ter todos aqueles mudou para cá ... e fundiu
xenoterracide

Respostas:

45

Já houve bastante atividade sobre o tópico em outros sites do Stack Exchange. Minha experiência de mudar do bash para o zsh, tanto quanto me lembro (foi anos atrás²), é que não perdi nada. Eu ganhei muito; aqui estão o que eu acho que são os recursos simples específicos do zsh que eu mais uso:

  • O recurso zsh que mais sinto falta quando uso ocasionalmente o bash é o autocd: no zsh, executar um diretório significa mudar para ele, desde que você ative a autocdopção.⁴

  • Outra característica muito útil é o globbing chique. Os caracteres dos hieróglifos são um pouco difíceis de lembrar, mas extremamente convenientes (por exemplo, geralmente é mais rápido procurá-los do que escrever o findcomando equivalente ). Alguns dos exemplos mais simples:
        foo*~*.bak= todas as correspondências, foo*exceto aquelas correspondentes *.bak
        foo*(.)= somente arquivos regulares correspondentes foo*
        foo*(/)= apenas diretórios correspondentes foo*
        foo*(-@)= apenas links simbólicos pendentes correspondentes foo*
        foo*(om[1,10])= os 10 arquivos mais recentes correspondentes foo*
        foo*(Lm+1)= apenas arquivos de tamanho> 1MB = no diretório e todos os seus subdiretórios, recursivamente⁴
        dir/**/foo*foo*dir

  • Para renomear fantasia, o zmvbuilt-in pode ser útil. Por exemplo, para copiar todos os itens filepara file.bak:zmv -C '(*)(#q.)' '$1.bak'

  • O bash e o zsh têm um sistema de conclusão decente que precisa ser ativado explicitamente ( . /etc/bash_completionou autoload -U compinit; compinit). O Zsh's é muito mais configurável e geralmente mais sofisticado.

Se você executar o zsh sem a .zshrc, ele iniciará um menu interativo que permite escolher opções de configuração. (Algumas distribuições podem desativar isso; nesse caso, execute autoload zsh-newuser-install; zsh-newuser-install.) Eu recomendo ativar as opções de histórico recomendadas, ativar a conclusão (“novo estilo”) e ativar as “opções comuns de shell”, exceto beep. Mais tarde, configure mais opções à medida que você as descobre.

² Na conclusão programável época era característica do assassino do zsh, mas o bash adquiriu logo depois.
⁴ Os recursos que o bash adquiriu apenas na versão 4 (ainda não estão disponíveis em muitos sistemas) são do tipo menor.

Gilles 'SO- parar de ser mau'
fonte
5
O Bash 4.0 agora suporta o autocdrecurso que você discute acima. Habilite o recurso usando o comando shopt -s autocd. Em seguida, o recurso funciona como você descreveu.
Philluminati
O zsh também possui o wherecomando interno, para não ser confundido com o whichcomando.
Sildoreth 17/04
@EdGrimm Acho que o GNU e o FreeBSD podem fazer tudo o que os qualificadores do zsh glob podem fazer (com -execum shell para coisas como seleção com ee um pipeline para ferramentas como sorte sedpara reescrever ee classificar). Muito mais verbalmente, é claro.
Gilles 'SO- stop be evil'
Depois de verificar e verificar novamente a página de manual do achado por mais de uma década, acho que parei de procurar. Mas se eu tivesse verificado uma última vez antes de comentar, teria visto pelo menos a opção -size agora reduz as unidades em bytes.
Ed Grimm
11

Além disso, a conclusão da guia padrão é melhor que o bash ... por exemplo ...

~/.e.dO TAB será expandido para ~/.emacs.d/no zsh, o bash emitirá apenas um bipe.

ocodo
fonte
isso não aconteceu. qual setoptopção não padrão você usa para isso (se houver)?
Percebi que _-.defini como curinga. zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' . Veja stackoverflow.com/q/7906078/311660
ocodo
10

zshpermite editar um comando de várias linhas (consulte o editor de linha zsh ), o bash não. Se você tentar o mesmo truque ( Ctrl-p), o bash buscará o último comando.

Pedro Silva
fonte
2
O Bash faz isso, pelo menos a partir da versão 4.2.37; ele substitui as novas linhas por ponto e vírgula e fornece uma única linha para editar.
Keith Thompson.
11
Ainda não é tão legal. (:
SilverWolf 23/01
8

O Bash possui o recurso de poder abrir portas usando

/dev/tcp/host/port

ou

/dev/udp/host/port

No entanto, ele está desabilitado no Debian, pois é visto como um obstáculo (se o caminho realmente existir) e está fora do escopo do que um shell deve fazer. Mais informações [lista de discussão debian]

Portablejim
fonte
5
O zsh possui o ztcp embutido, embora tenha mais recursos que o / dev / tcp do bash, não possui o / dev / udp. Eu preferiria usar o socat.
Stéphane Chazelas
2

Que - aprimorado no zsh

O whichcomando bash apenas revela a localização de um comando.

No Zsh whichirá revelar a definição de an alias, a fonte de a functione a localização de um comando.

Digamos que tivemos um apelido de shell:

alias gg='git log'

No Bash, se perguntássemos: which ggo resultado seria nulo

Em Zsh: which ggnos dará ...

gg: aliased to git log

Digamos que tivemos uma função shell:

hello() {
    echo "Hello World"
}

No Bash, se perguntássemos: which helloo resultado seria nulo.

Em Zsh: which hellonos dará ...

hello() {
    echo "Hello World"
}
ocodo
fonte
O Bash fornece a mesma funcionalidade através do typecomando (embutido). E apenas para nitpick: whiché um comando externo, não um bash embutido.
Torkel Bjørnson-Langen
Pergunta canônica relevante: por que não usar "qual"? O que usar então?
Anthony G - justiça para Monica em
0

zsh - um shell completo

existem muitos, lendo zshcontrib(1)um deles é possível detectar duas versões de jogos autoloadativáveis tetris(o outro com ncurses) zshem competição com emacs, por completude (como descrito).

=

Gostaria de mencionar a =palavra - chave, que pode causar irritação curl(os URLs geralmente contêm ?var=valneles; mas é unsetoptpossível, eu acho):

  • q file =less( gentoo) resolveq file $(which less)

= expande para o caminho completo do comando em questão.

outras guloseimas

outras coisas, fora da mente, são o prompt certo RPS1=%d(para exibir $PWDem estilo), Alt + H( run-helpie. man), Alt + ? ( which-command) varede zed( autoloadfunção), semelhante Alt + Xao minibuffer do Emacs para executar widgets sem vinculá-los, aliases globais e de sufixo, duração da conclusão do comando de rastreamento de histórico estendido -me -regexcorrespondentes, emulação de shell (por exemplo csh, kshcom emulate) e autoload run-helpcom trechos de arquivo para os built-ins.

lamentações

Acho que a maioria dos recursos, se não todos, foram implementados há muito tempo e, lendo os registros de alterações, não há grandes mudanças e adições de novos recursos, o que é muito triste (nada mais a explorar e descobrir).

bashparece estar mais distribuído no readline(ao contrário de zle) e gnu historyno espírito linux; por exemplo, funções readline e combinações de teclas podem ser aplicadas globalmente (como mantidas ~/.inputrce /etc/inputrc) se não forem substituídas por específicas do bash bind.

conclusão

Pessoalmente, acho que emacs(especialmente da perspectiva de (o atual?) emacs-noxSabor) ser a inspiração para um software excepcional, zshe tmuxfiz um bom trabalho como exemplo nessa implementação; para as pessoas que apreciam seu valor (ao nível de não precisar / depender do Xservidor). O shell Unix é poderoso o suficiente e sua continuidade e consistência são suficientes para um fluxo de trabalho e produtividade adequados (na computação geral).

ocodo
fonte