Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027

    [HOWTO] Introduzione alla shell ZSH

    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

    A questi indirizzi ho messo le due versioni online:




    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 :
    codice:
    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:
    codice:
    autoload -U compinit
    compinit
    Adesso riproviamo a lanciare zsh e vediamo cosa abbiamo fatto inserendo le due linee sopra nel file .zshrc. Digitiamo :
    codice:
    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:
    codice:
    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
    codice:
    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:
    codice:
    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:

    codice:
    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
    codice:
    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:



    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:
    codice:
    %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:
    codice:
    autoload -U promptinit
    promptinit
    prompt clint
    Avremo un prompt preimpostato chiamato clint.
    il cui risultato sarà questo prompt un po' esagerato nelle informazioni mostrate:
    codice:
    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:
    codice:
    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:
    codice:
    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:
    codice:
    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:
    codice:
    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:
    codice:
    gianiaz:x:1000:1000:,,,:/home/gianiaz:/bin/bash
    Per cambiare la shell di default per l'utente corrente potremo semplicemente usare il comando chsh:
    codice:
    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 :
    codice:
    gianiaz@dune:~%echo $0
    zsh
    e avrete di ritorno la shell che state usando.


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

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Veramente mooolto interessante! :mavieni:
    Slack? Smack!

  3. #3
    Utente di HTML.it L'avatar di lnessuno
    Registrato dal
    Feb 2002
    Messaggi
    2,732
    molto interessante... mi sa che la userò per un pò!


    grazie per la segnalazione e per la guida!!

  4. #4
    grande! :metallica



    allegare un .zshrc sbavoso?

  5. #5
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    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

  6. #6
    Utente di HTML.it L'avatar di indre
    Registrato dal
    Jan 2002
    Messaggi
    2,735

    re



    bacio le mani...
    When I was young I used to pray for a bike. Then I realized that God doesn't work that way. So I stole a bike and prayed for forgiveness.

  7. #7
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    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)
    codice:
    # {{{ 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
    
    # }}}

  8. #8
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345
    Credo di non avere tempo attualmente di sbattermi sulla zsh, ma mi sembra chiaro ed interessante. Bel lavoro

  9. #9
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    grazie a tutti dei complimenti

  10. #10
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    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:

    codice:
    www.casamia.it
    cribio.com
    www.google.it
    ed ecco il comando:
    codice:
    compctl -k "( ` < ~/.hosts_ssh `)" telnet rlogin rsh ssh
    Soluzione:
    La definizione di un completamento comincia con il comando
    codice:
    compctl
    l'opzione
    codice:
    -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)
    codice:
    ` `
    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:
    codice:
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.