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