23
Shells and Commands Emanuele Leonardi

Shells and Commands

  • Upload
    teneil

  • View
    46

  • Download
    0

Embed Size (px)

DESCRIPTION

Shells and Commands. Emanuele Leonardi. Le shell. Una shell è un programma di interfaccia tra lo utente e il sistema operativo. - PowerPoint PPT Presentation

Citation preview

Page 1: Shells and Commands

Shells and Commands

Emanuele Leonardi

Page 2: Shells and Commands

Le shell

Una shell è un programma di interfaccia tra lo utente e il sistema operativo.

L’interazione è mediata da comandi che possono essere dati o in maniera interattiva o raggruppati in un file di testo, detto script, ed eseguiti come un singolo programma.

Esistono molte shell che però si riconducono a 3 famiglie principali:

•Bourne shell: sh, bash

•C shell: csh, tcsh

•Korn shell: ksh, zsh

Ogni famiglia è omogenea a livello di script (salvo poche eccezioni) ma cambiano le possibilità di editing dei comandi interattivi (richiamo dei comandi precedenti, completamento automatico dei nomi, etc.).

Page 3: Shells and Commands

man

man mostra una pagina di documentazione su un comando Unix.

In VMS: help

Uso: man comandoEsempio: > man man

E se non conosco “comando” ?> man -k keyword

Esempio: voglio cambiare la mia password, che comando devo usare?> man -k password

chpasswd (8) - update password file in batch

passwd (1) - update a user’s password

userpasswd (1) - a graphical tool to change password

N.B. di solito in fondo alla pagina man esiste la sezione SEE ALSO con una lista di comandi correlati.

Page 4: Shells and Commands

ls

ls mostra la lista dei file in una directory.

In VMS: dir

Uso: ls [directory ]

efault: directory corrente.

Esempio:> ls /usr/local/doc

mtv.html mysql uushred

xanim.doc

L’opzione -l mostra le caratteristiche (tipo,

dimensione, data di modifica, ecc.) dei file:> ls -l /usr/local/doc

total 64

-rwxr-xr-x 1 root root 22629 Aug 30 1997 mtv.html

drwxr-xr-x 4 root root 1024 Sep 15 1997 mysql

drwxr-xr-x 2 root root 1024 Jul 14 1997 uushred

-rw-r--r-- 1 root root 37481 Jan 26 1997 xanim.doc

Page 5: Shells and Commands

cd / pwd

cd cambia la directory di lavoro.In VMS: set def Uso:cd [directory]Default: user home directory.

Directory particolari:˜ User home directory (“cd ˜” = “cd”)/ Root directory del nodo. Directory corrente.. Directory madre della directory corrente

Per sapere in che directory ci si trova: pwd> cd> pwd/mnt/sda6/home/leonardi

Page 6: Shells and Commands

cat / more / less

cat visualizza uno o più file di testo.

In VMS: type

Uso: cat file1 [file2 file3...]

I file vengono mostrati sequenzialmente. Utile anche per fare il merging di più file.

Esempio:> cat list1.dat list2.data > listona.dat

more e less aggiungono a cat funzioni di paginazione (stile type /page in VMS ma con più possibilità) e ricerca.

Tasti utili:

<Return> Avanza di una riga

<Spazio> Avanza di una pagina

<?> o <h> Mostra i comandi disponibili

Page 7: Shells and Commands

ln

ln crea un link (puntatore) a un file pre-esistente.

Può funzionare in modalità hard (se il file originale viene cancellato il link ne conserva una copia) o soft (se il file originale viene cancellato il link rimane ma dà un errore se si prova ad usarlo).

Uso: ln [-s] file link

Se si usa il parametro -s il link è soft, altrimenti è hard.

Esempio:> ln -s /opt/lsf ˜/bin/lsf

> ls -l ˜/bin

lrwxr-xr-x 1 leonardi ec 28 lsf -> /opt/lsf

Page 8: Shells and Commands

who / which / whereis

who mostra gli user loggati sulla macchina.

In VMS: show user

Esempio:> who

root ttyp1 Nov 1 17:39 (:0.0)

leonardi ttyp6 Nov 1 17:53 (echosl)

which mostra dove si trova un comando.

Esempio:> which gnuchess

/usr/bin/gnuchess

whereis mostra anche la posizione del file man corrispondente.

Esempio:> whereis ls

ls: /bin/ls /usr/man/man1/ls.1

Page 9: Shells and Commands

uname

uname mostra le caratteristiche del computer che si sta usando.

Opzioni:

-n nome del nodo

-m architettura

-s sistema operativo (default)

-r release

-a tutto

Esempi:ender:leonardi> uname

Linux

ender:leonardi> uname -snrm

Linux ender 2.0.34 i586

ender:leonardi> uname -a

Linux ender 2.0.34 i586

uname è molto utile negli script!

Page 10: Shells and Commands

ps / kill

ps mostra i processi attivi sulla macchina.Di default: mostra solo i processi associati alla sessione corrente.

Per vedere tutti i processi sulla macchina usare “ps -ef” (HP, DEC, Solaris) o “ps aux” (SunOS, Linux, DEC).> ps -ef

UID PID PPID STIME TTY S TIME COMM

root 7400 7389 16:07:25 ttyp5 S 0:00.32 tcsh

kill manda un segnale ad un processo.Default: manda al processo il segnale TERM(inate) invitandolo a terminare.

> kill 7400 (invita 7400 a terminare)Se il processo 7400 è ancora presente provare con:

> kill -9 7400 (uccidi 7400)

Page 11: Shells and Commands

Variabili di Ambiente

Le Variabili di Ambiente (Environment Variables) permettono di accedere ed eventualmente modificare alcuni parametri che regolano il comportamento di un processo Unix.

Alcune variabili utili sono:

TERM tipo di terminale usato (xterm,vt100,…)

SHELL tipo di shell in uso (sh,csh,ksh,…)

USER nome dell’account in uso

HOSTNAME nome dell’host su cui si sta lavorando

DISPLAY schermo su cui vengono mandate le finestre grafiche

PATH lista delle directory in cui cercare i comandi da eseguire

MANPATH lista delle directory in cui cercare i file di documentazione usati da man

Page 12: Shells and Commands

printenv / setenv

printenv mostra una o più delle variabili di ambiente definite nel processo corrente.

Di default mostra la lista completa delle variabili.> printenv TERM

xterm

Per cambiare il valore di una variabile di ambiente il comando cambia a seconda della shell usata.

Per csh, tcsh:> setenv DISPLAY myxterm:0

Per sh, bash, ksh, zsh:> DISPLAY=myxterm:0

> export DISPLAY

N.B. tutte le variabili di ambiente di un processo vengono ereditate dai processi che esso genera.

Page 13: Shells and Commands

alias

Un alias è un nuovo comando definito in funzione dei comandi di sistema.

Viene creato con:

> alias ll=’ls -l’ sh, bash, ksh, zsh

> alias ll ’ls -l’ csh, tcsh

Una volta creato, un alias può essere utilizzato come qualsiasi altro comando di sistema.> ll /usr/local/doc

total 64

-rwxr-xr-x 1 root root 22629 Aug 30 1997 mtv.html

drwxr-xr-x 4 root root 1024 Sep 15 1997 mysql

drwxr-xr-x 2 root root 1024 Jul 14 1997 uushred

-rw-r--r-- 1 root root 37481 Jan 26 1997 xanim.doc

Per eliminare un alias “scomodo” esiste il comando unalias.> unalias ll

Page 14: Shells and Commands

Ridirezione dell’I/O

Di default l’input e l’output di un comando sono collegati al terminale su cui gira la shell.> myMC.exe

How many events ? 100

100 events produced. End

>

Tutte le shell permettono però di ridirigere l’I/O su un file usando > per l’output e < per l’input.> echo 100 > events.dat

> myMC.exe < events.dat > myMC.log

> cat myMC.log

How many events ?

100 events produced. End

>

L’I/O può anche essere ridiretto su una pipe.> echo 100 | myMC.exe > myMC.log

Page 15: Shells and Commands

Controllo dei Processi

• I comandi possono essere eseguiti in background, ossia senza tenere bloccata la shell mentre il comando viene eseguito. Per fare questo è sufficiente aggiungere & in fondo alla linea.

• Il comando jobs mostra una lista dei processi posti in background dalla shell corrente.

• Un job in background può essere riportato in foreground (ossia in modalità interattiva) con il comando fg.

• Un job interattivo può essere mandato in background sospendendolo e dando il comando bg (si veda l’esempio).

Page 16: Shells and Commands

Controllo dei processi: esempio> myMC.exe <events.dat >myMC.log &

[1] 1834

>

(grazie al & alla fine il comando viene eseguito in background. Il prompt ricompare immediatamente)> jobs

[1] Running myMC.exe <events.dat >myMC.log

>

(il comando jobs mostra che il processo sta effettivamente girando in background)> fg 1

myMC.exe <events.dat >myMC.log

(con fg il job viene riportato in foreground. Il prompt ricomparirà solo alla fine dell’esecuzione del comando)^Z

Suspended

> bg

[1] myMC.exe <events.dat >myMC.log

(il ^Z, i.e. CTRL-Z, sospende il job in foreground e mostra il prompt. Il comando bg mette in background il job sospeso)

Page 17: Shells and Commands

Script di login

Quando si apre una nuova sessione vengono eseguiti degli script standard che servono per configurare il proprio ambiente di lavoro. Questi script si trovano nella propria home directory e contengono di solito:

•Settaggi di variabili di ambiente

•Definizioni di alias

•Configurazione del comportamento della shell

Al momento del login viene eseguito:

.profile sh, ksh, bash

.zprofile zsh

.login csh, tcsh

Quando parte una shell (anche non di login):

.bashrc bash

.zshrc zsh

.cshrc csh (e tcsh se non esiste .tcshrc)

.tcshrc tcsh

N.B. al login viene prima eseguito il file “rc” e poi quello di login. P.es. prima .cshrc e poi .login

Page 18: Shells and Commands

Esempio: .login# Esempio di file .login

# Le righe che iniziano con # sono commenti

# Configura le variabili di ambiente

setenv PATH ”.:/bin:/usr/bin:/cern/bin”

setenv MANPATH ”/usr/man:/usr/local/man”

setenv EDITOR ”emacs”

# Scegli la stampante da usare in funzione

# della macchina su cui ci troviamo

switch (‘uname -n‘)

case ”hpl3rom1”:

setenv PRINTER ”lwl3ps”

breaksw

case ”trantor”:

setenv PRINTER ”babarlj”

breaksw

default:

setenv PRINTER ”siclas”

breaksw

endsw

Page 19: Shells and Commands

Esempio: .cshrc# Esempio di file .cshrc

# Configura il comportamento della shell

set history=20

set savehist=20

set prompt=”Emanuele>”

# Definisci gli alias utili (e nostalgici! ;-)

alias dir ’ls -Al’

alias up ’cd ..; pwd’

alias down ’cd \!*; pwd’

# Esegui altri script di inizializzazione

switch (‘uname -n‘)

case ”hpl3rom1”:

source /l3/script/l3init.csh

breaksw

case ”trantor”:

source \

/afs/infn.it/roma1/project/babar/babar.sh

breaksw

endsw

Page 20: Shells and Commands

Problema: rinominare tutti gli eseguibili della directory corrente.Soluzione: uso del costrutto di iterazione.

#!/bin/tcsh

# this is a comment

foreach i (*)

if( -x $i ) then

echo "moving $i"

mv $i $i{.old}

endif

end

#!/bin/sh

# this too

for i in *; do

if [ -x $i ]; then

echo "moving $i"

mv $i ${i}.old

fi

done

• nelle shell moderne alcuni comandi sono built-in command (if,foreach,echo), altri sono eseguibili esterni (mv)

• i built-in command e le sintassi sono molto simili tra le varie shell

• si possono usare potenti costrutti di iterazione

• attenzione alla differenza tra ' e " riguardo all'espansione delle variabili di shell

Shell Script: un Esempio (1)

Page 21: Shells and Commands

Problema: esecuzione condizionata multipla.Soluzione: uso del costrutto switch/case.

#!/bin/csh

...

switch ("$1")

case start:

echo "let's do it."

breaksw

case stop:

echo ”stop it!"

breaksw

default:

echo "bad syntax!!"

breaksw

endsw

...

#!/bin/sh

...

case "$1" in

start)

echo "let's do it.”

;;

stop)

echo ”stop it!"

;;

*)

echo "bad syntax!!"

esac

...

Shell Script: un Esempio (2)

Esempio:> myscript startlet’s do it.> myscript stopstop it!> myscript pippobad syntax!!

Page 22: Shells and Commands

find permette la cercare file in un file system in base alle loro proprietà (nome, tipo, attributi, ownership, ...).

Cerca nella directory corrente (.) e in tutte le sue

sottodirectory un file di nome simula.dat. > find . -name simula.dat -print./montecarlo/data/simula.dat

./olddata/simula.dat

Cerca nell’albero di directory /usr tutti i file con estensione .dat.> find /usr -name \*.dat -print

/usr/games/doom.dat

/usr/lib/netscape/mime.dat

Il backslash (\) è necessarioper impedire che la shell interpreti i caratteri spaciali (in questo caso “*”).

N.B. Il flag -print in alcuni sistemi è il default ma in altri è necessario.

find

Page 23: Shells and Commands

Problema: rinominare tutti gli eseguibili di un albero di directory. Soluzione: uso del comando find

Mettendo insieme i precedenti esempi:

#!/bin/shBINLIST=`find $1 -perm +0111 -and ! -type d`for i in ${BINLIST}; do mv $i $i.olddone

dove la condizione di ricerca e` l'AND (-and) tra la presenza dell' execute bit (-perm +0111) e dal fatto di non essere una directory (! -type d).

In alternativa si può usare il flag -exec che permette a find di eseguire un comando sui file trovati:

> cd somewhere> find . -perm +0111 -and ! -type d -exec mv {} "{}".old \;

• il {} sarà sostituito con ciascuno dei file individuati da find.• il \; identifica la fine del comando introdotto da -exec.• attenzione alle ”” che proteggono {} nel nome composto

Shell Script: un Esempio (3)