ti-enxame.com

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

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?
63
Macha

Já houve bastante atividade sobre o assunto em outros sites do Stack Exchange. Minha experiência de mudar do bash para o zsh, até onde 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 opção autocd.⁴

  • Outra característica muito útil é o globbing chique. o hieróglifosos caracteres são um pouco difíceis de lembrar, mas extremamente convenientes (como geralmente é mais rápido procurá-los do que escrever o comando equivalente find). Alguns dos exemplos mais simples:
    foo*~*.bak = Todas as correspondências para foo*, Exceto as correspondentes *.bak
    foo*(.) = somente arquivos regulares correspondentes a foo*
    foo*(/) = somente diretórios correspondentes a foo*
    foo*([email protected]) = somente links simbólicos pendentes correspondentes a foo*
    foo*(om[1,10]) = os 10 arquivos mais recentes correspondentes a foo*
    foo*(Lm+1) = somente arquivos de tamanho> 1 MB
    dir/**/foo* = foo* No diretório dir e todos os seus subdiretórios, recursivamente⁴

  • Para renomear fantasia, o zmv embutido pode ser útil. Por exemplo, para copiar todos os file Para 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_completion Ou autoload -U compinit; compinit). O Zsh's é muito mais configurável e geralmente mais sofisticado.

Se você executar o zsh sem um .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 do Shell", exceto beep. Mais tarde, configure mais opções à medida que você as descobre.

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

46

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

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

11
ocodo

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

10
Pedro Silva

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]

8
Portablejim

Que - aprimorado no zsh

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

No Zsh which irá revelar a definição de um alias, a origem de um function e a localização de um comando.

Digamos que tínhamos um alias do Shell:

alias gg='git log'

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

No Zsh: which gg nos dará ...

gg: aliased to git log

Digamos que tivemos uma função Shell:

hello() {
    echo "Hello World"
}

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

No Zsh: which hello nos dará ...

hello() {
    echo "Hello World"
}
2
ocodo

zsh - um Shell completo

existem muitos, lendo zshcontrib(1) um pode detectar duas versões de jogos autoload - capazes de tetris (o outro com ncurses) em zsh em concorrência com emacs, pela integridade (conforme descrito).

=

Gostaria de mencionar a palavra-chave =, Que pode causar irritação com curl (os URLs geralmente têm ?var=val Neles; mas é possível unsetopt , Eu acho que):

  • q file =less (gentoo) resolve para q file $(which less)

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

outras guloseimas

outras coisas, fora da mente, são o prompt correto RPS1=%d (para exibir $PWD em grande estilo), Alt + H (run-help Ou seja, man), Alt + ? (which-command), vared e zed (função autoload), semelhante ao minibuffer do Emacs Alt + X para executar widgets sem vinculá-los, aliases globais e de sufixo, duração de conclusão do comando de rastreamento de histórico estendido, matchers -m e -regex, emulação de shell (por exemplo, csh, ksh com emulate) e autoloadrun-help com 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 para explorar e descobrir).

bash parece estar mais distribuído em readline (em oposição a zle) e gnu history No espírito linux; por exemplo, funções readline e combinações de teclas podem ser aplicadas globalmente (como mantidas em ~/.inputrc e /etc/inputrc) se não forem substituídas por bind específico do bash.

conclusão

Pessoalmente, acho que emacs (especialmente da perspectiva de (o atual?) emacs-nox) Ser a inspiração para um software excepcional como zsh e tmux fez um trabalho muito bom em ser um exemplo nessa implementação; para as pessoas que apreciam seu valor (ao nível de não precisar/dependendo do servidor X). O Unix Shell é poderoso o suficiente, e sua continuidade e consistência são suficientes para um fluxo de trabalho e produtividade adequados (na computação geral).

0
user86041