PDA

Visualizza la versione completa : [HOWTO] Introduzione alla shell ZSH


gianiaz
08-02-2004, 10:12
Trovare info sulla zsh non è stato semplicissimo, così ho pensato di scrivere un piccolo howto per rendervi partecipi dei progressi fatti.
Al contrario di quanto potrà sembrare dalla mole di testo che sto per incollare in questo thread, non sono un grand esperto di zsh, parallelamente alla stesura di questo howto ho imparato un sacco di cose. Spero sia utile anche per voi e che magari venga messo tra i thread in rilievo in modo che possa avere un compenso morale allo sbattimento fatto :p

A questi indirizzi ho messo le due versioni online:

http://bbk.net.cn/user/gianiaz_hp/images/html.png (http://bbk.net.cn/user/gianiaz_hp/linux/howto/zsh-how-to.html) http://bbk.net.cn/user/gianiaz_hp/images/pdf.png
(http://bbk.net.cn/user/gianiaz_hp/linux/howto/zsh-how-to.pdf)

E qui invece inserisco la versione per il forum ;)

ZSH HOWTO
(scritto da gianiaz)


PRE:
Cosa è ZSH?


ZSH è una shell alternativa alla famosa bash.

Potrebbe nascere spontanea una seconda domanda: cosa è una shell?

Se il kernel è il nucleo, la shell è il guscio (shell=guscio in inglese).
Per shell si intende l'interfaccia (testuale) tramite la quale l'utente può operare sul sistema.
Il guscio esterno, accessibile all'umano, con cui è possibile interagire con le funzionalità offerte dal kernel, interprete e gestore dell'hardware.
La shell è un programma che gestisce la comunicazione fra utente e sistema operativo interpretando ed eseguendo i comandi dell'utente (la shell viene chiamata anche command interpreter).

Perchè cambiare dalla bash alla zsh?

Questa è la domanda più naturale, ed è quella che mi sono sentito fare quando ho chiesto aiuto in alcune chat.
Posso dirvi i motivi che mi hanno spinto a provarla:

La mia innata curiosità :-)
Il sistema di completamento


INTRODUZIONE
Come avrete capito questo how to cercherà di spiegare le pecularietà di zsh, soprattutto dal punto di vista dell'utilizzatore della shell, e non dell'amministratore di sistema che deve utilizzare il linguaggio di scritpting della shell. Zsh ha un suo linguaggio di scripting degno di nota, che però in questo howto non viene trattato.

Innanzitutto ecco un paio di link utili:

Per il download in caso non aveste la fortuna di avere un gestore di pacchetti serio :-P
http://www.zsh.org
Le pagine man:
http://zsh.sunsite.dk/Doc/
La guida:
http://zsh.sunsite.dk/Guide/

Avete installato?
Ok

Se volete cominciare a notare le prime differenze dalla bash aprite un terminale(se siete in x) oppure da console digitate zsh.
Eccovi la vostra nuova shell.
Provate subito a digitare :


cd [TAB]

e poi premete in continuazione [TAB], noterete che a differenza della bash, che richiede l'inserimento di un carattere che discrimini tra più directory che cominciano con lo stesso carattere, la zsh permette di scorrere tra le diverse directory disponibili.

Aumentiamo la posta.
Digitiamo exit(tornando cosi alla nostra shell di partenza) e creiamo nella nostra home directory il file .zshrc e scriviamo queste 2 linee:


autoload -U compinit
compinit


Adesso riproviamo a lanciare zsh e vediamo cosa abbiamo fatto inserendo le due linee sopra nel file .zshrc. Digitiamo :


ls -[TAB]

quelle che vedete sono le opzioni disponibili del comando ls. Figata, no?
altro esempio?
Per gli utilizzatori debian come il sottoscritto provate questa sequenza:


apt(8volte[TAB]) (9volte[TAB]) zs[TAB]

questo esempio è portato un po' all'estremo, ma che ne dite?

Per configurare in modo approfondito il completamento di zsh potete digitare


compinstall

In questo modo avvieremo la funzione compinstall, che ci guiderà attraverso delle domande lungo il processo di configurazione del completamento automatico di zsh. Tutte le nostre scelte verranno aggiunte alle opzioni da noi gia inserite nel file .zshrc. Volendo tramite questa interfaccia potremo salvare anche un backup del nostro file zshrc.Per il momento non trattiamo questo argomento e proseguiamo.

Oltre alle funzionalità di completamento zsh ha più di 150 opzioni da poter settare, ad esempio:


setopt autocd autopushd pushdignoredups

In questo caso l'opzione settata è cosi strutturata:

autocd indica che se al prompt inseriamo il nome di una dir seguita dal tasto [invio] è sottointesto il comando cd (change directory)


autopushd fa in modo che la directory in cui stiamo entrando venga memorizzata in uno stack di memoria.



pushdignoredups fa in modo che l'elenco di directory memorizzate nello stack grazie al comando precedente non contenga duplicati.

Ora, una volta inserita la linea precedente nel file .zshrc e riavviata la shell avremo una comodità in più. Poniamo l'esempio seguente:



dune% ls
cisco images mp3
dune% cd cisco
dune% cd ..
dune% cd images
dune% cd ..
dune% cd mp3
dune% cd ..
dune%
dune% dirs -v
0 ~/howto
1 ~/howto/mp3
2 ~/howto/images
3 ~/howto/cisco
4 ~
dune% ~2
dune% pwd
/home/gianiaz/howto/images

Entriamo in ognuna delle directory (cisco, images, mp3), dopodichè con il comando


dirs -v

vedremo il famoso stack di memoria che contiene le directory a cui abbiamo fatto 'visita', senza doppioni (nel caso fossimo entrati più di una volta in una delle dir). La comodità di cui parlavo è la seguente:

digitando ~2 andremo a posizionarci alla dir corrispondente.

FILES DI CONFIGURAZIONE

Quando la zsh viene avviata vengono letti diversi files di configurazione a seconda del metodo con cui viene chiamata.
Ci sono diversi tipi di shells, la shell interattiva, la shell di login e la shell non-interattiva.

La shell non-interattiva è quella che viene eseguita quando essa viene richiamata da un file script (quelli che cominciano con una chiamata #!)

La shell interattiva è quella davanti alla quale ci troveremo più spesso una volta scelta zsh come shell di default (un esempio per tutti può essere la shell aperta da un terminale all'interno del server grafico).

La shell di login, è principalmente quella che ci viene mostrata all'avvio del sistema, con tanto di richiesta di nome utente e password.

Ognuna di queste shell diverse richiama al suo avvio e al suo termine diversi files di configurazione che possono eseguire diverse istruzioni all'avvio della shell.
La seguente tabella mostra i files caricati dalle diverse shell:

http://bbk.net.cn/user/gianiaz_hp/linux/howto/tabella1.jpg

Da notare che la shell non-interattiva legge solo il file zshenv, quindi qualsiasi cambiamento di configurazione da cui dipende uno script di shell va messo qui (ad esempio la variabile PATH che dice alla shell dove andare a cercare i files eseguibili).
Una cosa da ricordare è che il file zshenv viene caricato ad ogni avvio di una qualsiasi shell, quindi è buona norma tenere al suo interno le configurazioni principali, e fare in modo che questo file sia più piccolo possibile, in modo da non rallentare l'avvio di una shell.

IL PROMPT

Il prompt è un'altra delle cose che si può personalizzare a piacere, sfortunatamente la variabile PS1 impostata per la bash non funziona cosi come dovrebbe in zsh. Quindi se hai un pormpt complesso dovrai riscriverlo per la zsh.

Prima di continuare vi mostro subito qual'è la stringa per rendere il prompt identico a quello preimpostato per la maggiorparte delle distribuzioni:


%PS1="%n@%M:%~%#"
gianiaz@dune:~%su
Password:
dune:/home/gianiaz#

L'unica differenza è che il simbolo usato per identificare l'utilizzo da utente è il % a differenza della bash che usa il $.

Vi segnalo anche questo metodo per avere a disposizione alcuni prompt preimpostati, anche se sul mio pc con debian sid e zsh ver 4.0.9 in alcuni casi manda zsh in segmentation fault.

Se all'interno del nostro .zshrc inseriamo le seguenti 3 linee:


autoload -U promptinit
promptinit
prompt clint

Avremo un prompt preimpostato chiamato clint.
il cui risultato sarà questo prompt un po' esagerato nelle informazioni mostrate:


zsh/4 3 %
[dom 04/02/08 08:22 CET][pts/5][i686/linux-gnu/2.4.24][4.0.9]
<gianiaz@dune:~>

Per vedere gli altri disponibili digitate:

prompt -l

La comodità di avere un prompt preimpostato è quella di poter curiosare all'interno della variabile PS1.
Introduciamo cosi il comando 'vared' per vedere com'è impostata una variabile, e che ci permette la sua modifica al volo.
Prendiamo in considerazione il prompt precedente al momento, visto che è semplice da analizzare:


gianiaz@dune:~%vared PS1
%n@%M:%~%#

In questo modo vediamo come è impostata PS1, spostandoci con le frecce a destra e a sinistra potremmo muoverci all'interno della variabile e modificarla al volo: proviamo ad inserire il codice %* per vedere le modifiche del prompt al volo:


gianiaz@dune:~%vared PS1
%n@%M:%~%*%#
gianiaz@dune:~8:35:26%

Per l'elenco di tutti i codici disponibili per impostare il prompt a vostro piacimento vi rimando alla pagina manuale:


man zshmisc

alla sezione 'Prompt Expansion'

La sezione del prompt appena sopra può indurre a pensare che la zsh e la bash siano incompatibili l'una con l'altra, in realtà sono molto comuni, e molte delle impostazioni della bash possono essere tranquillamente copiate nel file .zshrc per essere sfruttate. Un esempio potrebbe essere l'alias al comando ls che spesso troviamo preimpostato nelle distribuzioni, ovvero la possibilità di vedere il listato dei files codificato per colore per poter distinguere le directory dai files. Basterà andare a prelevare gli alias contenuti nel file ~/.bashrc e incollarli nel solito .zshrc. Ad esempio per ls che abbiamo appena citato inseriremo:


alias ls=”ls –color”


CAMBIARE LA SHELL DI DEFAULT

Se siete rimasti impressionati dalla shell zsh come lo sono rimasto io probabilmente vorrete metterla come shell di default.
La shell di default è impostata nel file /etc/passwd:


gianiaz:x:1000:1000:,,,:/home/gianiaz:/bin/bash

Per cambiare la shell di default per l'utente corrente potremo semplicemente usare il comando chsh:


gianiaz@dune:~$ chsh
Password:
Changing the login shell for gianiaz
Enter the new value, or press return for the default
Login Shell [/bin/bash]: /bin/zsh
gianiaz@dune:~$

Al prossimo login la shell di default per l'utente gianiaz sarà zsh. Se dopo tutte queste prove avete un po' di confusione e non sapete quale shell state utilizzando digitate :


gianiaz@dune:~%echo $0
zsh

e avrete di ritorno la shell che state usando.

----fine----(per il momento)----

Sergio Pedone
08-02-2004, 10:55
Veramente mooolto interessante! :mavieni:

lnessuno
08-02-2004, 11:41
molto interessante... mi sa che la userò per un pò! :)


grazie per la segnalazione e per la guida!! :ciauz:

vortex87
08-02-2004, 17:45
:sbav: grande! :metallica



allegare un .zshrc sbavoso? :sbav: :stordita:

gianiaz
08-02-2004, 20:45
ci sto lavorando, ma sta shell è davvero ampia e mi ci raccapezzo a fatica.

vi do questo link (segnalatomi da skyblaze) cosi magari ci guardate anche voi :))

http://zsh.sourceforge.net/Doc/Release/zsh.html#SEC_Top

comunque vi allego il file .zshrc che c'è nella distribuzione phlack (in edicola con linuxmagazinr). E' da li che ho appreso l'esistenza della zsh.

.zshrc (http://bbk.net.cn/user/gianiaz_hp/html.it/zshrc)

indre
09-02-2004, 10:42
:eek:

bacio le mani...

gianiaz
09-02-2004, 22:14
piccola aggiunta:

per avere il titolo del terminale emulato in questo formato:

utente@host percorso

aggiungete questo al file .zshrc (non è farina del mio sacco)


# {{{ Changing terminal window/icon titles

precmd () {print -Pn "\e]0;%n@%m: %~\a"}


which cx >&/dev/null || cx () { }

if [[ "$TERM" == ([Ex]term*|screen*) ]]; then
# Could also look at /proc/$PPID/cmdline ...
cx
fi

# }}}

Ilmalcom
09-02-2004, 22:20
Credo di non avere tempo attualmente di sbattermi sulla zsh, ma mi sembra chiaro ed interessante. Bel lavoro :D

gianiaz
09-02-2004, 22:41
grazie a tutti dei complimenti :D :smack:

gianiaz
11-02-2004, 00:26
Proviamo a personalizzare il completamento di alcuni comandi:
telnet rlogin rsh ssh

prima di tutto all'interno del file ~/.hosts_ssh mettiamo una lista di host:


www.casamia.it
cribio.com
www.google.it

ed ecco il comando:

compctl -k "( ` < ~/.hosts_ssh `)" telnet rlogin rsh ssh

Soluzione:
La definizione di un completamento comincia con il comando

compctl
l'opzione
-k
dice che gli argomenti che verranno utilizzati arrivano da un array, che sta all'interno dei "( )"

quello che viene tra messo backticks (sulla mia tastiera ALTGR+apice-sopra-il-punto-interrogativo)


` `

viene eseguito come comando nella shell zsh e il suo output viene restituito all'interno del comando.
In questo caso abbiamo messo il carattere '<' che è un 'input redirector'
<escursus>
(se non sapete cos'è andate a guardare il paragrafo Ridirezione e pipeline degli Appunti di informatica libera).
</escursus>
Se l'input redirector non viene preceduto da nulla zsh da in pasto che quello che viene dopo il < al comando cat.
Morale, quello che sta tra parentesi diventa l'elenco degli host messi nel file ~/.hosts_ssh.
Per rendere l'idea il comando sarà qualcosa di simile:


compctl -k "( www.casamia.it cribio.com www.google.it )" telnet rlogin rsh ssh

con la comodità di poter aggiungere tutti gli host che vogliamo senza modificare il comando.

Chiude il comando l'elenco degli eseguibili che dovranno sottostare a questa regola.

in questo modo quindi se scrivessimo

ssh [tab]
potremmo scorrere tra gli host da noi inseriti nell'apposito file.

Alla prox :D

Loading