====================================================================== Corso di Linux Esercitazione sulla shell ====================================================================== Liceo Fermi, Bologna - Marcello Galli, settembre 2009 sito di riferimento: http://www.helldragon.eu ---------------------------------------------------------------------- ------------------------ Punti da ricordare ------------------------ Comandi e nomi di files sono case sensitive I comandi hanno argomenti e flags (opzioni) che ne determinano il comportamento, i flags sono espressi da lettere, precedute da '-' Es.: ls -l filename.txt mostra il file di nome filename.txt con tutte le sue caratteristiche ( flag 'l' ) # indica un commento ; separa comandi sulla stessa linea Ctrl C interrompe un comando ........................... nomi dei files e directory ........................... - / indica la root: l'inizio della struttura gerarchica del file system; nomi che non iniziano con '/' si riferiscono alla directory corrente - ./ indica la directory corrente - ../ indica la directory nel livello superiore - ~ indica la directory principale dell'utente (detta 'home') - I files il cui nome inizia con . sono "nascosti", in genere sono files di configurazione - Non vanno usati spazi o caratteri speciali nei nomi di files, a meno di non racchiudere la stringa che rappresenta il nome fra apici ' ' oppure fra apici doppi " "; Oppure si puo' far precedere il carattere speciale dalla barra rovesciata: '\', che impedisce alla shell di interpretarlo. - Nei nomi di files: - * indica ogni stringa, - ? un carattere singolo - [a-e,l] : i caratteri a,b,c,d,e,l - [!a] : escluso il carattere a Per utilizzare uno di questi caratteri in un nome bisogna farlo precedere da'\' Ad esempio \* indica il carattere '*' invece che ogni stringa Esempi: | a*t # indica ogni file il cui nome inizia con 'a' e finisce con 't' | ?? # indica ogni file il cui nome e' composto di 2 caratteri | * # indica ogni file della directory | [a,b]* # i files con nomi che iniziano con 'a' oppure 'b' | [a-z]* # files con i nomi che iniziano con una lettera minuscola | [!a]* # files con nomi che non iniziano con 'a' ................. accessi ai files ................. Ogni file appartiene ad un utente ed a un gruppo, ogni file ha permessi per l'accesso: - i permessi sono: - x,r,w ; per esecuzione, lettura, scrittura - x per un direttorio indica permesso di ingresso nella cartella - ci sono 3 gruppi di permessi, e sono i permessi associati a: - u,g,o ; per proprietario del file, gruppo che possiede il file, altri (others), a sta per tutti (all) .................................................. standard output, standard input, pipes e redirect .................................................. Ad ogni comando (o programma) e' associato: - uno standard input (stdin) , - uno standard output(stdout) - uno standard error (stderr), questi possono essere rediretti su un file od altro dispositivo con gli operatori > , < , << , >> , tee '|' e' il simbolo della pipe, che riversa l'output di un comando sull'input del successivo ................... variabili di shell ................... E' possibile definire variabili, alcune sono gia' predefinite al login (variabili di environment) Per vedere le variabili di environment si usa il comando export Le variabili possono essere locali ad un programma o procedura, oppure "esportate" ai programmi o procedure che un programma genera, col comando export si definisce una variabile con: nomevar="stringa" Si richiama il contenuto di una variabile facendo precedere il nome dal segno: $ Esempio: $nomevar -------------------------- Esercizi -------------------------- 1. Help in linea : il comando man permette di accedere all'help in linea. Usatelo. Vi verra' mostrato l'output una pagina per volta; per scorrere il testo in avanti utilizzare la barra spaziatrice, per andare indietro la lettera b; una volta letto il testo premete la lettera q, per tornare all'uso del terminale. 1.a) Esempi: - man man : spiega il comando man - man touch : spiega il comando touch - man -k file : cerca i comandi che riguardano *file* - l'opzione -k permette di fare ricerche per parole chiavi 1.b) Esempi: - help : spiega qualcosa sulla shell - man bash : tutto sulla bash shell 2 - Uso dei files: si provi a: - elencare i files, - creare files, - stampare a terminale il contenuto dei files, - copiare, cambiare nome ai files, - listare il contenuto di files a terminale. - provare ad usare le wildcards ( * ? [a-vb] etc.) nei nomi dei files - tenere presente che: - copiare un file su un file che non esiste crea il file. - copiare un file su un file esistente lo sovrascrive Sommario dei comandi da utilizzare: 2.a) per lencare i files e guardarne le caratteristiche: - ls : mostra i files del direttorio - ls -l : da informazioni complete - ls -a : tutti i files, anche quelli nascosti - ls -t : mostra in ordine di data - ls -1 : un file per riga - ls .bashrc : elenca il singolo file .bashrc - ls -R : ricorsivo,(cioe' esteso a cartelle e sottocartelle) - ls -lrt : ordine di data inverso ; - stat nomefile : mostra tutti i dettagli sul file notate come le opzioni si possano combinare insieme, precedute da un unico segno '-' 2.b) per creare files e guardarne il contenuto: - touch nomefile : crea file vuoto o gli cambia la data - cat nomefile : mostra il file - more nomefile : mostra una pagina per volta - tail nomefile : mostra la fine di un file - head nomefile : mostra l'inizio del file - rm nomefile : elimina un file 2.c) per cambiare i permessi di accesso ad un file: - chmod : cambia permessi di accesso - chown : cambia il proprietario od il gruppo (puo' usarlo root) - chmod u+rwx filename : da permessi di accesso al proprietario - chmod a-rwx filename : toglie permessi a tutti - chmod a-x filename : toglie permesso di esecuzione (accesso se cartella) +: aggiunge permessi , - toglie permessi x: esecuzione, od ingresso nella directory, r:lettura, w:scrittura u: proprietario, g: gruppo cui il file appartiene, o:altri, a: tutti 2.d) uso dei wildcards nei nomi dei files: si provi ad usare le notazioni: * ? [] nei nomi dei files ESEMPI: | touch uno due tre quattro # creo 4 files vuoti | ls # li listo | ls *o # guardo quelli che finiscono con o | ls ??o # quelli che finiscono per o ed hanno 3 lettere | ls [dt][ur]e # mostra due e tre | ls [!u]* # non quelli che cominciano per u | | ls -a # vedo anche i files di configurazione (nascosti) | | ls -l # vedo che i files sono miei quado li ho creati, | # che sono vuoti ( dimensione 0) | | touch uno ; ls -l # ora ho cambiato data a uno | | cp .bash_history sette # faccio il file sette | mv uno unouno # cambio nome ad un file | ls -l # controllo cosa ho adesso | | more sette # guardo cosa contiene il file | tail sette | head sette | head -1 sette # guardo la prima riga | ls -l sette # guardo le caratteristiche | | mv nomefile nuovonome : cambia nome ad un file ESEMPI: permessi di accesso: | cp .bash_history llll # creo un file | more llll # lo guardo | | chmod a-rw llll # gli tolgo i permessi | more llll # ora non lo posso piu' vedere | ls -l llll # controllo i permessi | ( i caratteri iniziali ------ mostrano che non ho permessi ) | chmod u+w llll # do all'user (me stesso) permesso di scrittura | ls -l llll # controllo che permessi ho | more llll # non ho il perlesso r, non lo posso vedere | rm llll # pero' ora posso distruggerlo | ls # controllo che non ci sia piu' | ESEMPI: nomi anomali per i files i files possono avere nomi qualunque, anche con caratteri speciali, ma poi e' difficile usarli, ed occorre usare gli " " od il carattere di escape \\ - touch 2.2.quattrocento 5.txt - cp 5.txt " " # ora ho un file con un blank come nome - ls # ed e' quasi invisibile - ls -l - cp 5.txt file\ con\ nome\ sfortunato\? # come mettere caratteri speciali nei nomi - touch \* # creo un file con * come nome - ls * # non mi da quel file, ma tutti - ls "*" # per vedere solo il file 3 - Uso delle directories: si provi a creare directory, spostarsi nel file system, spostare files,creare directory, modificarne i permessi di accesso Sommario dei comandi da utilizzare: 3.a) per creare directory, muoversi fra le directory, spostare files - mkdir nome : crea un direttorio - rmdir nome : elimina un direttorio - cd nome : ci si sposta un un sottodireettorio - cd .. : si sale di un livello - cd - : torna nel direttorio precedente - pwd : mostra il direttorio corrente - mv file file2 directory : sposta i files nella directory 3.b) per dare permessi di accesso alle directories: - chmod u+rwx dirname : da permessi di accesso al proprietario - chmod a-rwx dirname : toglie tutti i permessi a tutti - chmod a-x dirname : tolgo permesso di accesso Spiegazione: - + aggiunge permessi , - toglie permessi - x: esecuzione, od ingresso nella directory, r:lettura, w:scrittura - u: proprietario, g: gruppo cui il file appartiene, o:altri, a: tutti ESEMPI: creare directory e spostare files: | touch 1a 2b 3c kkk # faccio dei files | mkdir dir1 dir2 dir3 # faccio directories | mkdir dir1/subdir # faccio subdirectories | mv kkk dir1/subdir # sposto il file kkk | | cd dir1/subdir # vado nella subdirectory | cp ../../[1-9]* ./ # mi copio qui i files di 2 | livelli sopra | ls -al # guardo cosa ho | ls -al ~ # guardo la home | ls -R ~ # guardo la home, e cosa c'e' sotto | | mkdir subdir2 | touch subdir2/file | ls subdir2 # non si puo' distruggere un | rmdir subdir2 # directtorio pieno | | rm -R subdir2 # distrugge in modo ricorsivo | ls subdir2 | | ls / # guardo in giro nel sistema | ls /home | cd /usr ; ls | | pwd # dove sono finito ? | cd ~ # torno alla home | mv sette dir1 # metto sette in dir1 | | more dir1/sette # guardo il file more /home/dir1/sette ESEMPI : permessi di accesso: | chmod u-x dir1 # mi vieto l'accesso al direttorio | cd dir1 | pwd | ls dir/sette | more dir1/sette | | chmod u+x dir1 # mi do accesso | | chmod u-r dir1/sette # tolgo accesso di lettura al file | ls dir1/sette # vedo il file ( accedo a dir1) | more dir1/sette # ma non posso leggerlo | rm dir1/sette # siccome posso scriverlo ( permesso w) # posso ancora distruggerlo 4 - files e links: si provi a creare links e vedere in cosa differiscono dai files ordinari Sommario dei comandi da utilizzare: - ln -s nome_file_fvero nome_link : crea un soft link, cioe' un riferimento ad un file, - ln nome_file_fvero nome_link : crea un hard link, cioe' una copia del nome del file ESEMPI: - mkdir aa aa/bb aa/bb/cc ; touch aa/bb/cc/uno ; - ln -s aa/bb/cc/uno linkauno : fa un soft link - ls -l : controllo che sia un link se provate a distruggere il file, il link esiste ancora, ma non punta piu' a nulla: - ls -l linkauno - rm aa/bb/cc/uno - ls -l linkauno - more linkauno viceversa se distruggete il link al file non succede nulla : - touch aa/bb/cc/uno - more linkauno - ls -l - rm linkauno - ls -l aa/bb/cc/uno un link definisce un percorso relativamente alla posizione in cui si trova, se lo spostate non punta piu' a nulla: - ln -s aa/bb/cc/uno link2uno - mkdir subsub - cat link2uno - mv link2uno subsub - cd subsub - cat link2uno ESEMPI : links e permessi se togliete ad un link i permessi di accesso per u (u= user cioe' voi stessi) al link non succede nulla, l'operazione e' effettuata sul file vero, come potete controllare. - ln -s aa/bb/cc/uno altrolinkauno - chmod u-rwx altrolinkauno - ls -l - cat altrolinkauno - ls -l aa/bb/cc/uno 5 - standard output, standard input, pipes e redirect: Sommario dei comandi da utilizzare: - cat ridirige lo standard input sullo standard output - echo stringa : scrive una stringa in output ESEMPI: | cat ~/.bash_profile # gira l'stdin ( il file in argomento) | # sull'stdout (il terminale) facendovelo | # vedere | | ls -l > elenco.txt # faccio un file con elenco files | | ls -l > /dev/null # /dev/null e' una pseudodevice fatta in modo | # tale che quello che ci si scrive viene eliminato, | # redirigere lo stdout su /dev/null equivale ad | # eliminarlo | | echo "prova" # scrivo prova su terminale (stdout) | echo "prova2 " > bbbb.txt # ora ho scritto su un file | cat bbbb.txt # scarico bbbb.txt su stdout (terminale) | | ls -lR | more # guardo i files una pagina per volta | | cat > readme # questo e' un modo di scrivere in un file | e qui scrivo quello # che si chiama readme | che mi pare | Cntrl-D | | # il tasto control+d | # ( che significa un end of file ) | # indica la fine dell'input | | > dummy # faccio un file vuoto di nome dummy | # redirigo nulla sul file di nome dummy | | ls > lista_files | cat lista_files | | ls -R -1 ~ > lista_files # notate come il file venga | cat lista_files # sovrascritto | | ls -a ~ >> lista_files # qui viene aggiunto alla fine del file | | cat lista_files | wc # conto le righe,parole,caratteri | | cat lista_files | tee elenco2 | wc # duplico anche su elenco2 6 - Variabili di shell: la shell e' anche un vero e proprio linguaggio di programmazione. Si provi a definire variabili e ad usarle; le variabili vengono sostituite dai loro valori quando sono precedute da: '$' Le variabili sono caratteri, non valori numerici, per valutare espressioni numeriche si usa la notazione: $(( esprtessione numerica )) Sommario dei comandi da utilizzare: | a="valore" # assegna valore ad una variabile | a = "ddd" # non va bene, NON ci vogliono spazi | attorno al segno '=' | echo $a # mostra a terminale il valore di una variabile | oppure una stringa | | b=$((3+2)) # valuta espressione intera ed assegna alla variabile la stringa corrispondente ESEMPIO: | a="variabilediprova" # assegno valore ad a | echo $a # guardo il valore | echo a # ho dimenticato il $ il valore non viene sostituito | | echo voglio vedere $a # mostra la stringa, ove ha sostituito | # la variabile | | b=$a # assegno nuova variabile | echo $a $b # la controllo | | a="SSS" # cambio in valore | echo $a | | echo * # vedo i miei files. Il carattere * viene | # espanso dalla shell | | echo \* # adesso vedo l'asterisco | echo "*" | | echo "$a" # sostituisce la variabile entro "" | echo '$a' # non sostituisce entro ' ' | | c=2+3 | echo $c # le variabili sono stringhe non numeri | | c=$((2+3)) # adesso sto usando variabili numeriche | echo $c | 7 - Environment Il comportamento della shell e' determinato da variabili di ambiente, come PATH, SHELL , PS1, che potete cambiare, eventualmente ridefinendole nei files .bashrc e .bash_profile Questi due files vengono eseguiti automaticamente quando iniziate una sessione di lavoro. Il valore di una variabile si ottiene con l'operatore $, ESEMPIO: | echo $PATH # mostra le directory ove la shell | # cerca di default gli eseguibili | # ( il contenuto della variabile $PATH ) | | PS1="iome=>" # come cambiare il prompt ESEMPI PIU' COMPLESSI: | env # mostra le variabili definite | | echo $PS1 # in PS1 c'e' il prompt | echo '$PS1' # la stringa non viene sostituita | echo "$PS1" # la stringa viene sostituita | echo PS1 # la stringa non viene sostituita | | PS1="prompt " # Il prompt si puo' personalizzare | PS1="\a ... " # beep | PS1="\t -> " # che ora e' | | PS1="`hostname` `pwd` " # host e direttorio | | `` esegue il comando e sostituisce con l'output del comando | | PS1=$PWD | mkdir subdir7 | cd subdir7 # in questo modo non va | | | PS1=`echo $PWD ` # neanche cosi' va, PWD viene | # sostituito subito, una volta sola | | PS1="`echo \\$PWD `" # questo e' il modo corretto, certe | # volte ottenere quello che si | # vuole non e' immediato | | PS1="\`ls -l \`" # si possono fare anche cose assurde | | questo camndo crea una nuova shell, 'figlia' | della precedente; | bash .bshrc e' rieseguito nella nuova shell | e ridefinisce PS1 come all'inizio | | cd ~ | mkdir prova16 prova16/prova17 | OLDPWD=~/prova16/prova17 cambiando questa variabile la shell | cd - crede che prima eravate li' e cd - | pwd vi ci porta | | | TERM i nomi dei terminali possibili sono in | /usr/lib/terminfo , provate a cambiare il | vostro in modo da confondere il computer | | ESERCIZIO:guardare i files .bashrc .bash_profile e capire cosa fanno, provare ad alterarli - source ~/.bashrc esegue .bashrc nella shell corrente - . ~/.bashrc fa la stessa cosa ESERCIZIO: provare l'operatore $ , Questo operatore si puo' usare in modo da sostituire solo parte di un nome - touch a1.txt - echo ${a%txt} - echo ${a%t*} - echo ${a%%t*} - echo ${a#?1} - echo ${a##*t} - echo ${a/1/2} cambia 1 con 2 - echo ${a:2:4} dal byte 2 al 4 - mv $a ${a%txt}.dat cambio suffisso al nome - $(( )) valuta operazioni aritmetiche - echo $((3+2)) # da 5 8 - Alias per i comandi : si possono ridefinire i comandi, definendo per essi degli alias. ESEMPI: | echo " prova" > a # mi faccio un file | copy a b # il comando copy non esiste | alias copy="cp" # mi piace e me lo definisco io | copy a b # adesso va | unalias copy # elimino l'alias | copy a c # non va piu' | | alias dir='ls --color=auto -1' # posso assegnare opzioni | dir | dir --color=never # se la metto nel comando in modo quella | dir # esplicito quella dell'alias non vale | | alias # elenco degli alias attivi | type -all ls # mostra l'alias ls 9 - Archivi e compressione Ci sono molti programmi per creare archivi di files e comprimere files Uno dei compressori piu' usato e' il gzip, abbiamo poi zip, che si trova anche sotto Windows, e tar per gli archivi. Poniamo di avere una directory con vecchi lavori da archiviare, do nome 'vecchilavori'; per creare un archivio con questi files si fa: tar -cvf vecchilavori.tar vecchilavori per vedere cosa contiene l'archivio: vecchilavori.tar si fa: tar -tvf vecchilavori.tar Possiamo spostare l'archivio in un'altra directory ed estrarre i files con: mkdir altradir ; mv vecchilavori.tar altradir ; cd altradir ; tar -xvf vecchilavori.tar Per comprimere l'archivio: gzip vecchilavori.tar otterremo un file di nome vecchilavori.tar.gz , che dovrebbe essere di minori dimensioni. Per espandere un file compresso: gunzip vecchilavori.tar.gz Si puo' direttamente decomprimere ed estrarre con: tar -xvzf vecchilavori.tar.gz e comprimere mentre si fa l'archivio, con: tar -cvzf vecchilavori.tar.gz vecchilavori Si puo' usare una pipe per fare le 2 operazioni di archiviazione ed estrazione, od il contrario, ad esempio: - zcat vecchilavori.tar.gz | tar -xvf - - tar -cvf - vecchilavori | gzip - zcat decomprime e scarica il file decompresso su stdout il segno - indica che l'output (o l'input) sono presi dalla pipe. Notate il seguente costrutto, per spostare un insieme di files e directory mantenendo le tutte proprieta' dei files: - tar -cvf - olddir | ( cd newdir ; tar -xvf - ) la directory olddir e tutto quello che contiene viene trasformata in un archivio, questo viene passato, tramite la pipe, ai comandi fra parentesi tonde; questi si mettono della directory newdir e li' estraggono quello che entra dalla pipe. 10 - Comandi per il monitoraggio del sistema: Provare i seguenti comandi e capire cosa vi mostrano: | dmesg : imostra messaggi prodotti dal kernel | | whoami # mostra chi sono | groups # mostra a che gruppo appartengo | | ps # mostra i processi associati al terminale | ps -u utente # mostra i processi dell'utente | ps aux # mostra tutti i processi attivi nel sistema | fra le indformazioni fornite c'e' il PID: un identificatore | unico per i processi. | | kill -9 numero_pid # manda il messaggio 9 (fine) ad un processo | | df # mostra l'occupazione dei dischi | du # mostra quanto spazio occupo nel direttorio corrente | du /etc # mostra quanto spazio occupa il direttorio in argomento | du -s /boot # mostra il totale dello spazio occupato | | who # mostra chi sta lavorando sulla macchina | who -l # mostra anche i terminali usati | w # mostra chi fa cosa | | last # chi si e' collegato recentemente | | uptime # da quando la macchina e' accesa | uname -a # mostra il nome e la versione del sistema operativo | uname -r # mostra solo la versione del kernel | | date # data ed ora | | file * # cerca di capire cosa sono i vostri files | ( eseguibili, direttori etc etc. ) | | lsof # mostra tutti i files aperti nel sistema | fuser -u -v * # mostra chi sta usando i vostri files | | | top # mostra chi impegna di piu' il sistema | ( si esce con Cntrl-C ) | | lspci # mostra le periferiche connesse al bus PCI | | netstat -nltpu # mostra pe perte TCP ed UDP aperte | netstat -ntpu # mostra le connessioni di rete attive | | host nome.dominio.com # mostra il numero IP corrispondente | al nome di un host | 11 - Utility per i testi: esistono programmi che permettono di fare varie operazioni su files testuali, si provi ad usarli Sommario dei comandi da utilizzare: questi non alterano il file, lo modificano e mostrano in output il risultato. | - wc nomefile # conta caratteri di un file, parole, linee | - grep stringa nomefile # cerca una stringa in un file | - sort nomefile # mette le linee in ordine alfabetico | - uniq nomefile # elimina linee doppie | | - sed s/pattern/altropattern/g nomefile # cambia pattern con altropattern | - sed /pattern/d nomefile # elimina linee col pattern | | - cut -c 10-20 nomefile # estrae i caratteri dal 10 al 20 | - cut -d" " -f2 nomefile # estrae la seconda parola, intende che | un blank separa le parole | | - paste file1 file2 # unisce i 2 files, mettendo insieme | 2 linee dei 2 files in un'unica linea | | - paste -d: test test # separa le 2 linee con il carattere ':' | | - tr a-z A-Z # trasformo minuscole in maiuscole | | - diff file1 file2 # confronta 2 files riga per riga | | - split -l10 file nome # fa tanti files che iniziano con 'nome' | ognumo con 10 linee del file test | | - tac nomefile # mette le linee del file in ordine inverso | | - find # utility per cercare files: | ESEMPI: | - cp ~/.bash_history test # mi faccio un file | - wc test # guardo quante linee ha | - grep ls test # guardo le linee con 'ls' | | - sed s/ls/lllllsssss/g test # cambio una stringa | - sed /ls/d # elimina linee con ls | | - paste test test # unisce i 2 files linea per linea | - paste -d: test test | | - diff test test # se sono uguali non dice nulla | | - split -l10 test nome # separo il file nome in tante parti | - ls nome* # quardo cosa ho ottenuto | - wc nome* # gurdo quante linee hanno | | - diff nomeaa nomeab # guardo le differenze fra 2 parti | | - tac nomeaa # guardo il file con le linee in ordine inverso | | - find ./ -name test -print # cerco in questa directory un | file no nome test e stampo il nome | | - find ./ -name "n*" -print # cerco i files che iniziano con n | - find ./ -newer test -print # cerco i files piu' recenti di test | ESEMPI PIU' COMPLESSI: utilizzo di utilities per i testi assieme alle pipes: faccio un nuovo file con alcune parole cambiate: | - touch prova ; ls -l > lista_files # mi creo un file con una lista di files | | - sed s/prova/AAAAAA/g lista_files > prova | | - diff prova lista_files # controllo le differenze | - diff prova lista_files | grep '>' | wc # conto le linee diverse | | conto quante righe del file: lista_files hanno la lettera p | | - grep p lista_files | wc | | conto quante righe del file: lista_files hanno la lettera p come primo carattere | | - cut -c1 lista_files | grep p | wc | | estraggo il primo carattere, lo trasformo in maiuscolo, | tolgo le linee doppie e guardo il risultato una pagina per volta: | | - cat lista_files | cut -c1 | tr a-z A-Z | uniq | more | | - grep a lista_files | wc # guardo quanti files iniziano con la lettere 'a' | 12 - esistono editor che non hanno bisogno dell'interfaccia grafica, ma oggi si usano poco, e soprattutto in casi di emergenza, provate l'editor vi: ESEMPIO: vi nomefile vi apparira' il vostro file nel teminale a caratteri, i caratteri della tastiera corrispondono ad operazioni diverse sul file, i caratteri per un uso essenziale di vi sono elencati nella tabella seguente: ========= ========================================================== carattere funzione ========= ========================================================== i permette di inserire un testo, premete il tasto escape quando avete inserito a analogo ad i, ma inserisce iniziando dalla posizione successiva a quella in cui siete x elimina un carattere dd elimina una riga rx sostituisca al carattere corrente il carattere x :q! si esce senza salvare ZZ salva ed esce dall'editor ========= ==========================================================