Caratteristiche uniche di bash rispetto a zsh


67

Sono stato un utente zsh per un bel po 'di tempo (prima di quel tcsh e prima di quel csh). Sono abbastanza contento, ma mi chiedevo se ci fossero delle caratteristiche convincenti di bash che non esistono in zsh. E viceversa, ci sono funzioni zsh che non esistono in bash. La mia attuale sensazione è che bash sia meglio:

  • Se lo conosci già e non vuoi imparare una nuova sintassi.
  • Esisterà sulla maggior parte di tutte le macchine * nix per impostazione predefinita, mentre zsh potrebbe essere un'installazione aggiuntiva.

Non sto cercando di iniziare una battaglia religiosa qui, motivo per cui sto solo cercando funzionalità che esistono solo in una delle conchiglie.


10
In che modo le caratteristiche che sono uniche per l'una o l'altra soggettiva? Onestamente non cerco una fiamma di fuoco e convengo che la familiarità dell'uno o dell'altro sia probabilmente un buon motivo per preferire quel guscio.
Tim,

Risposte:


40

zsh è per i vulcaniani. ;-)

Scherzi a parte: bash 4.0 ha alcune funzionalità precedentemente trovate solo in zsh, come ** globbing:

% ls /usr/src/**/Makefile

è equivalente a:

% find /usr/src -name "Makefile"

ma ovviamente più potente.

Nella mia esperienza, il completamento programmabile di bash funziona un po 'meglio di quello di zsh, almeno per alcuni casi (completando pacchetti debian per aptitude per esempio).

bash deve Alt + .inserire!$

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 ...

8
In bash, C-M-ea "shell-expand-line", che si espanderebbe cat `echo blubb | sed 's/u/a/'` a cat blabbe echo $SHELLalla echo /bin/bashnel mio caso. Inoltre, C-x *a "glob-expand-word", che si espanderebbe rm *.
Victor,

16

Vorrei sottolineare che bash non è installato di default su FreeBSD, OpenBSD o NetBSD, e non è installato di default su Solaris 10 (OpenSolaris lo ha come predefinito), l'ultima volta che ho usato un AIX e o Anche i server HP-UX non sono stati installati per impostazione predefinita.

Inoltre, su OpenSolaris / bin / sh NON è bash. È ksh. I maggiori problemi che ho come portatore di software sono le persone che assumono che / bin / sh sia bash e che accetti la sintassi estesa bash. Mentre questo sembra essere il caso sulla maggior parte delle distribuzioni Linux, non è il caso altrove ed è davvero fastidioso.


6
Si hai ragione. Purtroppo, tutti questi fornitori rendono molto semplice l'installazione di bash come pacchetto aggiuntivo. +1 per sottolineare la necessità del purismo / bin / sh negli script.
Kubanczyk,

@kubanczyk: se stai lavorando su macchine a cui non hai accesso root, potrebbe non essere così facile da installare, quindi penso che il punto di X-Istence sia valido. (Lavoro su un sacco di scatole di Solaris e gli amministratori di sistema sono tutti drogati di ksh. L'ultima volta ho provato a compilare il mio software che non avrei potuto vivere senza (git in questo caso) c'erano carenze con il compilatore installato, quindi anche quella strada mi fu interrotta.)
iconoclasta il

12

Anche se sono un utente bash, trovo una delle funzionalità di zsh piuttosto interessante: RPS1.

Ricorda:

  • PS1: il prompt allineato a sinistra
  • RPS1: il prompt allineato a destra

Campione:

Quando si utilizza qualcosa di simile

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

Viene visualizzato il messaggio a sinistra e la directory corrente viene spostata a destra. Scompare persino quando la linea corrente sta diventando troppo lunga! È perché zsh è abbastanza intelligente da dare bassa priorità a RPS1.

Puoi vedere uno screenshot di questo esempio su http://imgur.com/OAZhC .


9

Zsh ha una correzione ortografica. Se sei una lettera (o più) off, capirà cosa volevi dire.

Ha anche un completamento della scheda più robusto, che mi piace.

Zsh ha un'utilità di configurazione interattiva per impostarla come preferisci.

Alcuni test di velocità dicono che zsh è più veloce, ma non ho notato alcuna differenza.


1
Una versione ridotta di dash che supporta solo un sottoinsieme delle sue funzionalità e progettata per essere utilizzata negli script che dovrebbero essere eseguiti velocemente (ad esempio quelli di avvio) è dash.
Chucky,

zshha anche un'impostazione per consentire errori di stampa "one letter off" per l'uso della tastiera Dvorak.
vgoff,

6

Non conosco alcuna funzionalità bash che zsh non supporta. L'obiettivo di progettazione di zsh sembra includere il supporto di tutte le funzionalità aggiunte da Bash.

Uso ancora bash invece di zsh. Raramente mi imbatto in caratteristiche avvincenti che zsh supporta e che bash no. Problemi occasionali con zsh nel corso degli anni, o inesistenti su alcuni sistemi, non hanno valso la pena effettuare la transizione.

Finalmente posso usare la stessa shell su ogni sistema Unix, non vale la pena romperlo per funzionalità che non userò mai.

Le funzionalità presenti in zsh che non sono presenti in bash sembrano essere per lo più carine ma non quelle che contano di giorno in giorno.


3

bash ha molte caratteristiche che erano solo in zsh. Ora puoi avere 'completamento smart tab' anche con bash, come ha scoperto qualsiasi recente utente di Ubuntu.


1

Sostituzione del processo e globbing esteso sono le due caratteristiche che mi mancherebbero di più. Anche le impostazioni del prompt sono piuttosto interessanti: vedere il livello di annidamento quando si digitano istruzioni complesse sulle righe di comando. Il caricamento automatico consente di includere molte funzioni in ogni shell.


Suppongo che intendi dire che ti mancheranno quelli di zsh, dal momento che AFAIK tutto ciò che hai menzionato è incluso in zsh? (Ma sei sicuro che siano tutti assenti da bash? Ciò mi sorprenderebbe.) Ad ogni modo, aggiungere ciò renderebbe la tua risposta più chiara, dal momento che ci sono persone che rispondono su entrambi i lati del recinto bash / zsh. Inoltre, sarebbe utile fornire esempi di come ciascuna di queste funzioni semplifichi la vita della shell.
iconoclasta,

0

Sono un fan di zsh grazie al supporto della modalità vi, ma sto scoprendo che non è molto usato. Penso di aver letto che a zsh piace prendere le funzionalità popolari dalle altre shell e combinarle (quindi cose specifiche per bash e cose specifiche per csh sono entrambe disponibili in zsh).

Qualcuno ha anche detto che sto flettendo il mio fattore geek usando zsh, ma non posso confermare o smentire quella voce.


5
e sì, bash ha anche il supporto vi-mode.
pjz,

@Milner: puoi spiegare che tipo di supporto in modalità vi è in zsh che non è in bash? Se intendi semplicemente la possibilità di fare impostare -o vi sulla riga di comando, allora questo è chiaramente in entrambi. Se esiste un supporto esteso in zsh, potresti descrivere chiaramente di cosa si tratta e cosa aggiunge?
iconoclasta,

-1

Popolarità, #bash 430 utenti. #zsh 123 utenti. Credo che il sito zsh abbia un buon confronto tra zsh e altre shell. zsh ha un migliore supporto per la modalità vi.


2
Come è migliore la vi-mode in zsh? Sono un utente bash e ho la modalità vi attiva, quindi vorrei sapere se ci sono dei vantaggi nel passare.
ptman,

1
@ptman: il prompt di zsh può essere fatto per indicare la modalità (insert / normal). Readline non può farlo. Il prompt è anche più flessibile: puoi avere l'evidenziazione della sintassi ecc.!
unperson325680

@progo: ahh! molto bella. Ora potrei iniziare a usare la modalità vi in ​​zsh. Questo è stato uno dei miei motivi per rimanere con la modalità emacs finora.
iconoclasta,

@Brandon quel piccolo miglioramento è stato il motivo per cui ho cambiato shell.
unperson325680

-1

Bash sta usando la stessa sintassi per if e while che può essere usata negli script / bin / sh sulla riga di comando.
All'interno di zsh la sintassi è diversa. Usando efficacemente zsh devi ricordare entrambi, se stai usando un'istruzione if- o while sulla tua riga di comando


1
Ho provato questo, usando if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fisia la riga di comando che uno script, e ha funzionato come previsto in entrambi i casi. Quindi sembrerebbe che tu non abbia i fatti chiari.
iconoclasta,

Questo dipende da ciò che hai installato come / bin / sh. Se / bin / sh è bash, allora hai ragione. Altrimenti, bash non ha questo vantaggio. Se zsh è / bin / sh, zsh ha questo vantaggio. Date tutte le diverse shell che potrebbero fornire / bin / sh, consiglio personalmente di usare solo la shell desiderata per gli script di shell, in modo che la sua assenza indichi un problema con una soluzione ovvia, piuttosto che comportamenti bizzarri senza alcun indizio su come risolvere.
Ed Grimm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.