Shell II parte
Transcript
Shell II parte
La Shell continua Shell Unix - Linux comandi • ogni comando richiede al nucleo l’esecuzione di una particolare azione • i comandi esistono nel file system come files binari, generalmente eseguibili da tutti gli utenti (/bin) • possibilità di realizzare nuovi comandi: programmazione in shell comando Shell Shell (esecuzione comando) per ogni comando da eseguire la shell crea una shell figlia dedicata all’esecuzione del comando 1 Shell Unix - Linux I/O comando Standard Input Standard Output comando Standard Error tastiera video Navigazione nelle directory comandi principali Linux - Unix consentono di navigare la gerarchia di directory costituita dal filesystem. Il file system è organizzato come un albero rovesciato. / radice (root) ramo etc home users bin web dev nodo bash README foglie 2 Navigazione nelle directory comandi principali •all’atto del login, l’utente può cominciare a operare all’interno di uno specifico direttorio (la sua home). In seguito è possibile cambiare direttorio. • È possibile visualizzare il percorso completo attraverso il comando pwd (print working directory) • Essendo i file organizzati in gerarchie di direttori, il sistema operativo mette a disposizione dei comandi per muoversi all’interno di essi Navigazione nelle directory nomi relativi e assoluti • ogni utente può specificare un file attraverso: - nome relativo: è riferito alla posizione dell’utente nel file system (direttorio corrente) - nome assoluto: è riferito alla radice della gerarchia ( / ) • nomi particolari . è il direttorio corrente (visualizzato da pwd) .. è il direttorio ‘padre’ 3 Navigazione nelle directory comandi principali Nome assoluto: /home/web/README Nome relativo: ../web/README / radice (root) ramo etc home users bin web dev nodo bash dir corrente README foglie Comandi per la gestione del FS cd, rm, cp, mv, mkdir, rmdir Unix consente di ‘navigare’ la gerarchia di direttori costituita dal file system. • Abbiamo già visto il comando pwd, che consente di visualizzare il direttorio in cui ‘ci si trova’. È possibile ‘spostarsi’ da un direttorio a un altro attraverso il comando cd • Es: cd .. 4 cd cd modifica la dir corrente. Ad esempio: $pwd /home/users / radice (root) $cd .. $pwd etc home bin /home/ $pwd /home/users $cd ../.. $pwd / users web dev bash README Il comando cd sintassi cd [nuova_dir]. nuova_dir può essere: • il direttorio destinazione si può esprimere con il nome relativo oppure assoluto • se l’argomento non viene specificato, il nuovo direttorio è la home directory dell’utente • per spostarsi all’interno di un determinato direttorio bisogna avere per tale direttorio i diritti di esecuzione 5 cd cd serve per muoversi attraverso le directory. Esempio: albero delle directory: /home/antonio/documenti/personali/fattura10.txt posizione corrente: /home/antonio per portarsi nella directory dove si trova il documento fattura 10, digitare il seguente comando: cd documenti/personali. Per portarsi nella propria directory home digitare il comando cd mentre per portarsi nel primo livello dell'albero delle directory digitare cd / mentre con cd .. si va alla directory superiore. modifica delle dir creazione di un direttorio: mkdir <nomedir> eliminazione di un direttorio : rmdir <nomedir> per creare un direttorio è necessario avere i diritti di scrittura nel direttorio all’interno del quale lo si vuole inserire per eliminare un direttorio è necessario avere i diritti di scrittura di tale direttorio 6 Esempio di mkdir $pwd /home/users $ mkdir nadja $ cd nadja $ pwd /home/users/nadja / radice (root) etc home users nadja bin web dev bash README nuova dir Esplorazione ricorsiva - R specifica l’esecuzione del comando ls a tutti i direttori di un sottoalbero: ls -R 7 file di testo lettura è necessario avere i diritti di lettura per visualizzare il contenuto di un file di testo cat [<nomefile>...]: visualizza l’intero file more [<nomefile>...]: visualizza per videate altri comandi: •grep <stringa> [<nomefile>...] (ricerca di una stringa in un file), •wc [-lwc] [<nomefile>...] (conto di righe / parole / caratteri) file di testo Esempio lettura nadja@lab3-linux:~$ cat quasimodo ciascuno sta solo sul cuor della terra trafitto da un raggio di sole: ed è subito sera nadja@lab3-linux:~$ wc quasimodo 3 17 87 quasimodo nadja@lab3-linux:~$ grep sera quasimodo ed è subito sera 8 Cancellazione, copia e spostamento file è necessario avere i diritti di scrittura per modificare o eliminare il file rm <nomefile>: elimina il file cp <nomefile> <nomefile1> : copia file mv <nomefile>: sposta file e quindi rinomina Esempi nadja@lab3-linux:~$ cp quasimodo sera nadja@lab3-linux:~$ ls quasimodo sera nadja@lab3-linux:~$ mv quasimodo poesia nadja@lab3-linux:~$ ls poesia sera nadja@lab3-linux:~$ rm poesia nadja@lab3-linux:~$ ls sera 9 Startup Durante le operazioni di inizializzazione, la shell personalizza l’ambiente di uso eseguendo uno o più script di inizializzazione, contenuti in file di pathname prefissato (startup files) che si trovano, tipicamente, alcuni nella home directory dell'utente, altri in directory generali e sono definiti dall'amministratore del sistema Nota: il meccanismo è diverso per ogni shell, e può essere diverso a seconda delle modalità di esecuzione della shell (shell di login oppure no, shell interattiva oppure no, ...) Esempi di Shell Shell Comando rc rc Bourne Shell sh C-Shell csh Bourne Again Shell bash Zsh zsh Korn Shell ksh Tcsh tcsh Come riconosco la shell? Come cambio la shell? Chi Complessità(lc) B. Rakitzis 1,00 S.R. Bourne 1,17 UCB 2,03 GNU, LINUX 3,36 P. Falstad 3,53 David Korn(AT&T) 3,73 5,27 $ echo $SHELL $sh ….. ^D per uscire 10 Startup file di configurazione della shell: ”.profile" shells di Unix : c-shell, bourne Shell, Korn Shell e Bash, normalmente quando un nuovo utente viene creato il sistema si preoccupa di creare un ".profile" nella home directory dell'utente a meno che il file suddetto non esista già, in questo caso si utilizzerà il file esistente. Startup Bash I primi comandi vengono eseguiti dai files: $HOME/.bash_profile Normalmente questo file contiene il comando per l'esecuzione di un altro file profile: $HOME/.bashrc # include .bashrc if it exists if [ -f ~/.bashrc ]; then source ~/.bashrc fi 11 .profile esempio file di configurazione : # commands common to all logins export OPENWINHOME=/usr/openwin export MINICOM="-c on" export MANPATH=/usr/local/man:/usr/man/preformat:/usr/man:/usr/X1 1/man:/usr/openwin/man export HOSTNAME="`cat /etc/HOSTNAME`" export LESSOPEN="|lesspipe.sh %s" export LD_LIBRARY_PATH=/usr/X11/lib/Mesa-2.1/lib export SHADERS=/usr/BMRT2.3.4/shaders export POVINI=/usr/povray3/povray.ini PATH="$PATH:/usr/X11/bin:/usr/andrew/bin:$OPENWINHOME/bin: /usr/games:/usr/:."LESS=-MM .profile … #PS1='`hostname`:`pwd`# ' if [ "$SHELL" = "/bin/pdksh" -o "$SHELL" = "/bin/ksh" ]; then PS1="! $ " elif [ "$SHELL" = "/bin/zsh" ]; then PS1="%m:%~%# " elif [ "$SHELL" = "/bin/ash" ]; then PS1="$ " else PS1='\h:\w\$ ' fi PS2='> ' ... alias ll='ls -l' 12 .bash_profile PATH=.:$HOME/bin:/usr/local/bin:/usr/bin :/bin:/usr/bin/X11:/usr/games PS1='ciao > ' TERM=vt100 export # commands common to all logins export OPENWINHOME=/usr/openwin il comando "export" serve a rendere visibile a tutti i nostri processi una variabile d'ambiente precedentemente definita da un comando "set" oppure definita direttamente dal comando "export", infatti come nell' ms-dos io potrei definire una variabile d'ambiente con il comando "set" ma se non la esportassi essa rimarrebbe confinata esclusivamente ai processi che vengono generati in quella sessione, invece con il comando "export" rendiamo il risultato del comando "set" disponibile per tutti i processi. 13 export stesso risultato sia in questo caso : export OPENWINHOME=/usr/openwin che in quest'altro : set OPENWINHOME=/usr/openwin export OPENWINHOME Naturalmente agendo nel primo caso risparmio un istruzione. Per interrogare poi la variabile o per utilizzarla all'interno di programmi o scripts è sufficiente aggiungere una "$" al nome della variabile stessa (es. "cd $HOME/work" equivale a "cd /users/nadja/work") Shell: variabili d’ambiente Visualizzare le variabili di ambiente digitando al prompt della shell: set Viene visualizzato elenco di variabili di ambiente della bash. Ognuna di queste variabili contribuisce a personalizzare l'ambiente. PATH definisce ciò che viene chiamato il percorso di default. Per il vostro account può somigliare a quanto segue: PATH=/usr/local/bin:/usr/X11R6/bin:/usr/bin: /bin:/usr/X11R6/bin:/home/pippo/bin indica dove trovare i programmi. 14 Variabili d’ambiente Analizziamo le variabili d'ambiente che sono d’interesse in questo momento: export MANPATH=/usr/local/man:/usr/man/preformat:/usr /man:/usr/X11/man:/usr/openwin/man "MANPATH" serve ad informare la Shell dove si trovano i files che il comando "man" deve interpretare per fornirci l'aiuto richiesto, salta subito agli occhi la caratteristica del carattere di congiunzione delle directoryes, a differenza dell' ms-dos nella Shell si utilizza il carattere ":" al posto del carattere ";". PATH="$PATH:/usr/X11/bin:/usr/andrew/bin:$OPEN WINHOME/bin:/usr/games:/:." .profile if [ "$TERM" = "" -o "$TERM" = "unknown" ]; then TERM=linux fi In questa fase si interroga la variabile TERM (notare come in fase di utilizzo si antepone il carattere "$" al nome della variabile) per vedere se è già stato definito il tipo di terminale utilizzato, se non è stato definito si definisce come terminale la console del sistema (in questo caso Linux). 15 .profile #PS1='`hostname`:`pwd`# ' if [ "$SHELL" = "/bin/pdksh" -o "$SHELL" = "/bin/ksh" ]; then PS1="! $ " elif [ "$SHELL" = "/bin/zsh" ]; then PS1="%m:%~%# " elif [ "$SHELL" = "/bin/ash" ]; then PS1="$ " else PS1='\h:\w\$ ' fi PS2='> ' export PATH TERM PS1 PS2 ALIAS alias Crea oppure rimuove il pseudonimo di un comando. Attenzione quando si termina la sessione di lavoro vengono eliminati anche gli alias, per mantenerli è necessario inserirli nel profile della console. 16 History Ripetizione veloce su linea di comando ripetere un comando digitato prima: premere il tasto con la freccietta in su. In questa maniera accedete alla history dei comandi. Se l'history dei comandi digitati è troppo lunga e/o vi ricordate le prime lettere del comando potete richiamarlo direttamente anteponendo ad esso il punto esclamativo. History Ad esempio se avete digitato il comando: % ls -lR| grep fortune |sort +4n per trovare i file "fortune" ordinati per grandezza e lo volete richiamare, è sufficiente dare il comando: % !ls oppure % !l Questa funzionalità é particolarmente utile quando si devono riscrivere comandi molto lunghi. In pratica quando gli si passa qualcosa del tipo "!nome" la shell interpreta il comando "Esegui l'ultimo comando digitato, che si trova nella history, che inizia con nome". 17 History Se poi il problema è la cattiva digitazione di un comando è possibile correggere l'errore senza stare a riscriverlo. % ls -lR| grap fortune |sort +4n con il comando '^ra^re' viene sostituita la stringa 'ra' con 're' e viene eseguito automaticamente il comando che ne risulta. % ls -lR| grap fortune |sort +4n bash: grap: command not found % ^ra^re ls -lR| grep fortune |sort +4n ./fortune-0.2/debian: ./fortune-0.2: ./fortune.it-1.51: -rw-r--r-- 1 8044 users 429 Oct 26 1998 fortune.lsm -rw-r--r-- 1 8044 users 514 Oct 24 1998 fortune.6 ... History La Bash mette a disposizione un utile meccanismo di ricerca che fa la stessa cosa ma in modo più veloce: basterà premere i tasti CTRL+R e il vostro prompt di sistema diventerà il seguente: (reverse-i-search)`': A questo punto sarà sufficiente digitare le iniziali del comando ricercato o di parole presenti nello stesso. Per esempio, se usate spesso il comando: mount -t ext2 /dev/hda5 /mnt/hd/dati/personali/foglietti_elettronici sarà sufficiente premere CTRL+R e quindi scrivere la parola "dati" (per esempio): vi apparirà l'intero comando scritto sopra, che potrete riutilizzare semplicemente premendo INVIO. 18