Quali caratteristiche sono in zsh e mancano da bash o viceversa?


62

Come utente Linux, ho sempre usato bash perché era l'impostazione predefinita su ogni distribuzione che ho usato. Le persone che usano altri sistemi Unix come BSD sembrano usare altre shell molto più frequentemente. Nell'interesse di imparare un po 'di più, ho deciso di provare zsh.

Come utente bash:

  • Quali funzionalità mi mancheranno?
  • E quali dovrei cercare?


5
@Gilles un giorno potrebbe essere bello avere tutti quelli spostati qui ... e uniti
xenoterracide

Risposte:


45

C'è già stata un po 'di attività sull'argomento su altri siti di scambio di stack. La mia esperienza di passaggio da bash a zsh, per quanto posso ricordare (è stato anni fa²), è che non mi sono perso nulla. Ho guadagnato molto; ecco cosa penso siano le semplici funzioni specifiche di zsh che utilizzo di più:

  • La funzione zsh che mi manca di più quando uso occasionalmente bash è autocd: in zsh, eseguire una directory significa cambiarla, a condizione che tu autocdattivi l' opzione.

  • Un'altra caratteristica molto utile è l'immaginazione globbing. I caratteri dei geroglifici sono un po 'difficili da ricordare ma estremamente convenienti (come in, spesso è più veloce cercarli che scrivere il findcomando equivalente ). Alcuni degli esempi più semplici:
        foo*~*.bak= tutte le corrispondenze foo*tranne quelle corrispondenti *.bak
        foo*(.)= solo corrispondenza dei file regolari foo*
        foo*(/)= solo corrispondenza delle directory foo*
        foo*(-@)= solo corrispondenza dei collegamenti simbolici penzolanti foo*
        foo*(om[1,10])= la corrispondenza dei 10 file più recenti foo*
        foo*(Lm+1)= solo i file di dimensioni> 1 MB = nella directory e tutti i suoi sottodirectory, ricorsivamente⁴
        dir/**/foo*foo*dir

  • Per rinominare fantasiose, l' zmvintegrato può essere utile. Ad esempio, per copiarli tutti filein file.bak:zmv -C '(*)(#q.)' '$1.bak'

  • Sia bash che zsh hanno un sistema di completamento decente che deve essere attivato esplicitamente ( . /etc/bash_completiono autoload -U compinit; compinit). Zsh è molto più configurabile e generalmente più elaborato.

Se esegui zsh senza a .zshrc, avvia un menu interattivo che ti consente di scegliere le opzioni di configurazione. (Alcune distribuzioni potrebbero disabilitare questo; in tal caso, eseguire autoload zsh-newuser-install; zsh-newuser-install.) Consiglio di abilitare le opzioni di cronologia consigliate, attivare il completamento ("nuovo stile") e attivare le "opzioni di shell comuni" tranne beep. Successivamente, configura più opzioni non appena le scopri.

² All'epoca il completamento programmabile era la caratteristica killer di zsh, ma Bash lo acquisì poco dopo.
⁴ Le funzionalità che bash acquisite solo nella versione 4 (quindi non sono ancora disponibili su molti sistemi) sono di tipo più piccolo.


5
Bash 4.0 ora supporta la autocdfunzionalità di cui sopra. Abilitare la funzione con il comando shopt -s autocd. Quindi la funzione funziona come descritto.
Philluminati il

zsh ha anche il wherecomando integrato , da non confondere con il whichcomando.
Sildoreth,

@EdGrimm Penso che GNU e FreeBSD find possano fare tutto ciò che i qualificatori di zsh glob possono fare (con -execuna shell per cose come la selezione ee una pipeline in strumenti come sorte sedper riscrivere ee ordinare). Molto più verbalmente, ovviamente.
Gilles 'SO- smetti di essere malvagio' l'

Dopo aver controllato e ricontrollato la manpage di ricerca per più di un decennio, credo di aver smesso di cercare. Ma se avessi controllato un'ultima volta prima di commentare, avrei visto almeno l'opzione -size ora prende le unità in byte.
Ed Grimm,

11

Anche il completamento della scheda predefinita è migliore di bash ... ad esempio ...

~/.e.dTAB si espanderà in ~/.emacs.d/in zsh, bash emetterà solo un segnale acustico.


no. quale setoptopzione non predefinita usi (se ce ne sono)?

Mi sono reso conto di aver _-.impostato come carattere jolly. zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' . Vedere stackoverflow.com/q/7906078/311660
ocodo

10

zshti permette di modificare un comando multilinea (vedi editor di linee zsh ), bash no. Se provi lo stesso trucco ( Ctrl-p), bash recupera l'ultimo comando.


2
Bash fa questo, almeno dalla versione 4.2.37; sostituisce le nuove righe con punti e virgola e ti dà una singola riga da modificare.
Keith Thompson,

1
Non è così carino. (:
SilverWolf,

8

Bash ha la caratteristica di poter aprire le porte usando

/dev/tcp/host/port

o

/dev/udp/host/port

Tuttavia, è disabilitato in Debian in quanto viene visto come un ostacolo (se il percorso esiste effettivamente) e al di fuori dell'ambito di ciò che una shell dovrebbe fare. Ulteriori informazioni [mailing list debian]


5
zsh ha incorporato ztcp, che ha più capacità di / dev / tcp di bash, non ha / dev / udp. Preferirei usare socat però.
Stéphane Chazelas,

2

Quale - migliorato in zsh

Il whichcomando in bash rivela solo la posizione di un comando.

In Zsh whichrivelerà la definizione di an alias, la fonte per a functione la posizione di un comando.

Diciamo che abbiamo avuto un alias di shell:

alias gg='git log'

In Bash se chiedessimo: which ggil risultato sarebbe nullo

In Zsh: which ggci darà ...

gg: aliased to git log

Diciamo che avevamo una funzione shell:

hello() {
    echo "Hello World"
}

In Bash se chiedessimo: which helloil risultato sarebbe nullo.

In Zsh: which helloci darà ...

hello() {
    echo "Hello World"
}

Bash fornisce la stessa funzionalità tramite il typecomando (incorporato). E solo per nitpick: whichè un comando esterno, non un built-in bash.
Torkel Bjørnson-Langen,


0

zsh - una shell completa

ci sono molti, la lettura attraverso zshcontrib(1)uno in grado di rilevare due versioni di autoload-Abilitare tetrisgiochi (l'altro con ncurses) in zshin concorrenza con emacs, per completezza (come descritto).

=

Vorrei menzionare la =parola chiave, che può causare irritazione con curl(di solito gli URL hanno ?var=valin loro; ma è unsetopt-able, penso):

  • q file =less( gentoo) si risolve inq file $(which less)

= si espande nel percorso completo del comando in questione.

altre chicche

altre cose, fuori di testa, sono il giusto prompt RPS1=%d(da mostrare $PWDin stile), Alt + H( run-helpcioè. man), Alt + ? ( which-command) vared, e zed( autoloadfunzione), simile Alt + Xal minibuffer di Emacs per eseguire widget senza vincolarli, alias globali e suffissi, durata del completamento del comando di tracciamento della cronologia estesa -me -regexcorrispondenti, emulazione shell (ad es. csh, kshcon emulate) e autoload run-helpcon frammenti di file per gli incorporati.

Lamentazioni

Penso che la maggior parte, se non tutte, delle funzionalità siano state implementate molto tempo fa e, leggendo i log delle modifiche, non ci sono cambiamenti importanti e aggiunte di nuove funzionalità, il che è molto triste (niente da esplorare e scoprire più).

bashsembra essere più distribuito in readline(al contrario di zle) e gnu historynello spirito di Linux; ad esempio, le funzioni readline e le combinazioni di tasti possono essere applicate a livello globale (come mantenute in ~/.inputrce /etc/inputrc) se non sostituite da specifiche bash bind.

conclusione

Personalmente penso emacs(specialmente dalla prospettiva di (l'attuale?) emacs-noxSapore) essere l'ispirazione per l'eccezionale software simile zshe ha tmuxfatto un ottimo lavoro nell'essere un esempio in tale implementazione; per le persone che ne apprezzano il valore (al livello di non necessità / a seconda del Xserver). La shell Unix è abbastanza potente e la sua continuità e coerenza sono sufficienti per un flusso di lavoro e una produttività adeguati (nel calcolo complessivo).

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.