se la bash viene chiamata con sh fa finta di essere una bourne shell
ed esegue all'inizio:
- /etc/profile
- ~/.profile
- il file definito da: $ENV
- se e' chiamata come sh interattiva esegue solo il file definito
dalla variabile:
Environment:
l'ambiente in cui opera la shell e' definito da
una serie di variabili, (variabili di environment) il simbolo $
sostituisce al nome della variabile il suo valore;
ad esempio $PATH e' la lista di directory in cui vengono cercati
gli eseguibili, $PS1 il prompt della shell.
Con il comando export si rendono le variabili di
environment accessibili ai sottoprocessi.
Elenco dei principali comandi di shell
Elementi generali
- exit : esce dalla shell
- exec comando : esegue il comando al posto della shell
- history : mostri gli ultimi comandi eseguiti
(sono memorizzati nel file: ~/.bash_history)
- Cntrl C : interrompe un comando
- Cntrl D : end of file
- le frecce richiamano i comandi precedenti
- Tab completa un nome di file o un comando
- Cntrl S e Cntrl Q controllano lo scrolling
- Cntrl E porta il cursore a fine linea
- ; separa piu' comandi dati sulla stessa linea
- # indica commento (che va dal carattere # a fine linea)
- \ e' usato come escape caracter
( il carattere che segue non e' interpretato dalla shell)
- . comando : esegue il comando nell'ambito della shell corrente
- comando & : esegue il comando in background
- ` comando ` : e' l'output del comando (command substitution)
- = : assegna una variabile
- $ : valuta una variabile
- ${ } : valuta una variabile facendo sostituzioni
- $(( )) : valuta un'espressione aritmetica
- ( ) : racchiudono comandi eseguiti in una sub-shell
- [[ ]] effettua un test
- [ ] racchiude elementi di un test
- { comando; comando ; } ragguppa comandi
(le parentesi vanno separate dal resto da spazi bianchi)
- Redirection:
- comando > file : lo standard output del comando finisce nel file
- comando >> file: lo standard output del comando viene aggiunto
in coda al file
- comando < file : lo standard input del comando e' il file
- comando | comando : i comandi sono concatenati, lo standard output del
primo e' lo standard input del secondo.
- comando &> file : redirige sia stdin che stdout
- Esecuzione condizionale: i comandi restituiscono un return code,
0 e' vero, !=0 falso ( il contrario del C) .
- comando1 && comando2 : il comando 2 viene eseguito se comando1 riesce
- comando1 || comando2 : comando 2 viene eseguito se comando1 fallisce
- Wild cards :
- ~ e' il direttorio principale dell'utente (home)
- * e' ogni carattere
- ? un carattere qualunque
- [a-d,f] range di caratteri: a,b,c,d,f
Ottenere informazioni
- help :informazioni generali sulla shell
- man: informazioni
- man comando : informazioni sul comando
- man -k keyword :informazioni sui comandi relativi alla keyword
- apropos keyword :informazioni sui comandi relativi alla keyword
- man -t comando > file.ps : produce un postscript con le informazioni
- whereis comando : dove e' l'eseguibile il source ed il man del comando
- locate pattern : dove sono i files relativi al pattern
- which comando : dove e' l'eseguibile
- ascii : tabella codici ascii
Listare i files
- ls a* : mostra i files che iniziano con a
- ls [a-c]* : i files che iniziano con a,b oppure c
- ls a*[a7k] : iniziano con a e finiscono con a,7 oppure k
- ls a?c : file con a, una lettera, poi c
- ls [!a] : files che NON iniziano con a
- ls {a,b,c}d : questo e' : ad,bd,cd
- tree -d : mostra albero delle directory
- stat nomefile : mostra tutte le caratteristiche di un file
o di un link
- lstat , oppure stat -l : fa riferimento al file vero,
non al link
- lsof : mostra tutti i files aperti nel sistema
- fuser nomefile : mostra chi sta usando un file
- :
- :
- :
- :
Spostarsi nel file system
- tree -d : mostra albero delle directory
- cd direttorio : : si va nel direttorio
- cd .. : :al parent directory
- cd ~ : : all'home directory
- cd - : : directory in cui si era in precedenza
- pwd : : mostra direttorio corrente
$PWD e' il direttorio corrente, $OLDPWD il precedente
Guardare i files
- more nomefile : : visualizza files una pagina
per volta, mentre il file viene mostrato si possono dare i comandi:
- spazio: avanti una pagina
- b : indietro una pagina
- q : interrompe la visualizzazione
- :n : va al file successivo
- more * : mostra tutti i files
- less file : analogo a more , ma con piu' opzioni
- cat nomefile : mostra file
- tail nomefile : mostra la fine di un file
- tail -100 nomefile : ultime 100 linee
- tail -f nomefile : la fine del file,
man mano che viene scritto, interromperlo con Cntrl/C.
- head nomefile : mostra l'inizio del file
- wc nomefile :
conta linee, parole, caratteri del file
- file nomefile : cerca di capire cosa e' il file
- od -c nomefile : mostra i singoli bytes del file
(octal dump)
- strings nomefile : mostra le
stringhe di caratteri contenute nel file
- diff file1 file2 : : differenze fra 2 files
- patch : : usando un file di differenze
prodotto da diff, ricrea un file originario
Creare, distruggere, spostare i files
- touch nomefile : : crea file vuoto o gli cambia la data
- rm nomefile : : elimina un file
- mv nomefile nuovonome : : sposta un file
o gli cambia nome
- mv file1 file2 file3 directory : :
sposta una serie di files nella directory
- split file : : spezza un file in
tante parti piccole (si ricompongono con cat)
Links
- ln -s nome_file_vero nome_link : fa un soft link
- ln nome_file_vero nome_link : fa hard link
Permessi di accesso ai files
- chown utente:gruppo file : cambia proprietario di un file
- chmod a+x file : rende il file eseguibile per tutti
- chmod og-r file : solo il proprietario puo' leggere il file
- chmod u-w file : il proprietario non puo' cambiarlo
Find: trovare files
- find /usr -name 'x*' -user 'root' -print :
cerca i files in /usr e sottodirectories,
che appartengono a root ed iniziano
con la lettera x, e li mostra (-print)
- find . \! -name '*.gz' -print :
cerca, nel direttorio corrente e sottodirectories,
files che non finiscono con gz e li mostra
- find /home/carlo -size 0 -ok rm{} \; :
cerca i files vuoti di carlo e li elimina, ma chiede conferma (-ok)
{} indica i files trovati, uno per uno.
- find /home/carlo -empty -exec rm{} \; :
come soppra, ma non chiede conferma
- find . -name '*.f' -o (-mtime -3 -atime -6) exec rm{} \;
: uso or di 2 condizioni
- find /var/log -mtime 2 -print :
files modificati da meno di 2 giorni
- find /var/log -atime +3 -print :
accesso piu' di 3 giorni fa
- find /var/log -ctime +3 -print :
test del creation time
- find /var/log -newer file -print :
piu' nuovo del file
- find /var/log -perm 664 -print :
selezione in base ai permessi di accesso (644=-rw-rw-r--)
- find /dev -type f -print :
selezione regular files, altri tipi sono:
b = block dev, c=char dev, d=dir , p=pipe, l=link, s=socket
- -amin -cmin -mmin access, creation , modification
time in minuti
- -nouser : files di un utente inesistente
- -nogroup :files di un gruppo inesistente
Input ed output
- echo stringa : mostra la stringa
- echo "$variabile" : il contenuto della variabile
- echo '$variabile' : la stringa $variabile
( niente sostituzione)
- echo " \a" : un beep, altri caratteri speciali:
\n=newline , \r=return , \f=form feed, \nnn=codice ascii
- comando > /dev/null :
esegue il comando e butta via l'output
- printf : questo comando stampa con sintassi tipi C
- read -p prompt nomevar : legge variabile da stdin,
prima di leggere produce un prompt su stdout
Piping e redirect
- ls > lista.txt : : stdout ridiretto su lista.txt
- ls >> lista.txt : :si aggiunge in coda a lista.txt
- ls -l | more : l'stdout di ls e' l'stdin di more
- cat :redirige stdin su stdout, ha vari usi:
- cat>nomefile : :
di seguito si scrive il contenuto del file,
si termina con Cntrl D
- 2> : : redirige stderr
- &> : : redirige stdout ed stderr
- 2>&1 : : stderr su stdout
- n>& m : : file descriptor n su m
- << "fine" ... fine : :
questo costrutto si usa nelle procedure,
usa come stdin quello che segue, fino al terminatore "fine"
Compressione files, archivi, copie byte per byte
- tar -cvf archivio.tar file1 file2 dir1 :
creo un archivio contente: file1 file2 ed il direttorio dir1
- tar -tvf archivio.tar :guardo cosa contiene un archivio
- tar -xvf archivio.tar : estraggo i files
- tar -tvzf archivio.tar.gz : estraggo i files
da un archivio compresso
- zcat archivio.tar.gz | tar -tvf - : altro modo per fare la cosa
- gzip archivio.tar : comprimo un file
- gunzip archivio.tar.gz : decomprimo un file
- bzip2, bunzip2, bzcat, tar -xvj file.bz2 :
comandi analoghi per il compressore bzip2
- zip,unzip, zipinfo, zipinfo -h :
comandi analoghi per il compressore zip
-
- dd : copie byte a byte
- dd if=/dev/hda of=backup_master_boot_record bs=512 count=1
copia il master boot record del disco primario master
Agire sul file-system
I nomi dei dischi sono:
- /dev/hda : primary master
( /dev/hda1 , hda2 etc. sono le partizioni )
- /dev/hdb : primary slave
- /dev/hdc : secondary master
- /dev/hdd : secondary slave
- /dev/sda : primo disco scsi
- /dev/sdb : secondo disco scsi (st i tape scsi)
- /dev/fd0 : il floppy
Queste cose sono permesse solo all'utente root.
- fdisk -l /dev/hda : mostra la partition table
- fsck -v -r /dev/hda1 : ripara un file system
- mkfs -t ext2 /deb/hdb2 :
fa file system di tipo ext2 sulla partizione 2 del primary slave:
- mount -o remount,rw /dev/hda1 : rimonta read-write
Operare sui processi ed utenti
- ps : mostra processi
- ps aux : mostra tutti i processi
- du : mostra spazio disco usato
- df : mostra i file systems
- kill -9 numero_processo : manda al processo il segnale 9
- trap : entro una procedura, per reagire ad un segnale
- whoami : mostra chi sono
- groups : a che gruppi appartengo
- passwd : cambia la password
- passwd carlo : cambia la password di carlo
( solo root o carlo possono farlo)
- members audio : membri del gruppo audio
- who : mostra chi e' collegato
- w : chi e' collegato e cosa fa
- last : mostra ultimi accessi alla macchina
- useradd, userdel : aggiungono od eliminano utente
- adduser, addgroup : in certe distribuzioni ci sono
questi comandi, piu' comodi degli analoghi di cui sopra
- date : mostra ora e giorno
- date -s '+1hour' : metto l'orologio avanti di un'ora
(lo fa root)
- uptime : da quanto il sistema e' acceso
- uname -a : nome sistema operativo
- uname -a : informazioni sul sistema operativo
- uname -r : versione del kernel
- lsof : mostra files aperti
- top : mostra chi occupa di piu' il sistema
( si esce con cntrl/C )
- free : mostra la memoria libera
- times : mostra quanto e' occupata la cpu
- time comando : esegue e mostra quanto impiega
- nice comando :esegue a bassa priorita'
Interagire col server X11
- xdpyinfo mostra caratteristiche del server
- xwininfo mostra caratteristiche di una finestra
- cntrl+alt+f1 passa a terminale virtuale 1,
in genere ci sono 6 terminali virtuali, corrispondenti ai tasti f1-f7
- cntrl+alt+f7 passa a terminale virtuale 7 ,
ove in genere c'e' l'X server
- cntrl+alt+backspace ferma il server X11
- cntrl+alt+ tasto-tastierina cambia risoluzione
anche il tasto + lo fa.
- X -probeonly 2>&1 | more : simulo la partenza
del server X11 e guardo i messaggi
- startx : fa partire l'X11
Jobs in batch
- comando1 & : comando che va per conto suo (in background)
- nohup comando1 & : va anche quando si chiude il terminale
- at 8pm may 29 -f/home/user/programma :
il programma viene eseguito alle 8 del 29 maggio
- comando : eseguo comando
- Ctrl z : lo interrompo
- jobs : guardo i comandi che ho in corso
- bg %1 : mando il job 1 in background
- fg %1 : lo riprendo a terminale
Variabili di shell ed alias
- alias lc='ls --color=auto' :
definisce comando lc come un ls con opzione colore
- unalias ls : elimina l'alias lc
- PATH : : ove cerca comandi
- DISPLAY : terminale per l'output X11
- SHELL : shell corrente
- USERNAME : nome dell'utente
- PWD : direttorio corrente
- HOSTNAME : nome host
- HOME :
- PS1 : il prompt
L'utente puo' definire variabili, renderle accessibili ai sottoprocessi
( comando export ) etc.
$ : operatore che effettua le sostituzioni: :
- PS1="io@`hostname`=>" : : ridefinisce il prompt
- echo $PATH : mostra il PATH
- PATH=/usr/games:$PATH : aggiunge al PATH
- export : mostra variabili passate ai sottoprocessi
- export DISPLAY=nomePC:0.0 : display X11
- set | more : controlla l'environment
- unset variabile : elimina la variabile
- type comando : mostra se un comando e' un alias o eseguibile
Sostituzioni di variabili piu' complesse:
( per pattern si intende un insieme di caratteri, eventualmente con wildcards: * ? etc.)
- ${var#pattern} : elimina il pattern dall'inizio di var
- ${var##pattern} : elimina il pattern dall'inizio ( il pattern piu' lungo possibile)
- ${var%pattern} : elimina il pattern alla fine
- ${var/patternold/patternnew} : cambia il pattern col nuovo
- $(( .. )) : valuta espressioni aritmetiche,
analogo a let
- [[ expression ]] : 0 od 1 a seconda che sia vera o falsa
- Entro una procedura:
- $# : numero argomenti di una procedura
- $0 : nome della procedura
- $1 : primo argomento di una procedura
- $2 : secondo argomento
Formato per le condizioni
- true : vero
- false : falso
- Condizioni per le stringhe:
- [ -n stringa ] : vero per stringa non nulla
- [ -z stringa ] : vero per stringa nulla
- [ stringa1 == stringa2 ] :
- [ stringa1 != stringa2 ] :
- Condizioni per i files:
- [ -d file ] : vero se il file e' un direttorio
- [ -e file ] : se esistee
- [ -x file ] : se si puo' eseguire
- [ -r file ] : se si puo' leggere
- [ -w file ] : se si puo' scrivere
- [ -s file ] : esiste e non e' vuoto
- Condizioni per gli interi:
- [ $i -eq $j ] : eguale
- [ $i -ne $j ] : diverso
- gli altri operatori sono: -gt -lt -le -ge :
- -a : and
- -o : or
- Esecuzione di comandi sotto condizione:
- command && command2 : command2 eseguito se
command riesce (ret. code 0)
- command || command2 : command2 eseguito se
command fallisce
Controllare il flusso delle istruzioni, esempi
- esecuzione condizionale:
- if [ $i == $k ] ; then echo "eguali" ; echo $i ; fi
- if [ $i == $j ] ; then echo "i=j" ;
elif [ $i != $k ] ; then echo " i=k" ;
else echo "diverso" ; fi
- esegue con $i = nome dei files, in successione
- for i in file1.ps file2.ps ; do lpr $i ; done ;
- loop finch� la condizione e' vera
- while [ true ] ; do ls ; sleep 3 ; done ;
- loop finch� la condizione e' falsa
- until [ false ] ; do ls ; sleep 3 ; done ;
- loop con indice
- for i in $( seq 1 10 ) ; do echo $i ; done
- istruzione case:
case $i in
*.gif ) xv $i ;;
*.txt ) more $i ;;
esac
Utility per i testi
Sono programmi che manipolano i testi,
molto utili assieme alla shell nelle procedure,
sono filtri, da usare con pipes
tr : translate characters
A questa utility si danno in argomento 2 liste di caratteri, nel file elaborato ogni carattere
della prima lista viene sostituito dal carattere corrispondente della seconda.
- tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXY
: questo converte in maiuscolo
- tr a-z A-Z :
- tr '[:lower:]' '[:upper:]' :
- tr -d '\n' : elimina i new-line
- tr -s '\n' : elimina i new-line doppi successivi
tr: formati delle stringhe per specificare le sostituzioni:
- [a-z] : indica un range di caratteri
- [c*3] : indica 3 volte c : ccc
- [c*] : usato nella seconda stringa indica: tante volte c quante nella prima stringa
- [:ascii] : indica tutti caratteri ascii
cut : seleziona campi (colonne) in un file
- cut -c 10-20 file : estrae caratteri dal 10 al 20 di ogni linea
- cut -d: -f1,5 file : estrae campi da 1 a 5 ,
campi delimitati da :
paste: unisce 2 files
- paste file1 file2 file3 : l'output (stdout) ha una linea del file1 seguita da
una del file2 ed una del file3, poi ancora una del file 1 e cosi' via.
- paste -d: file1 file2 : qui usa come separatore fra le linee dei 2 files :
- paste -s -d"\t\n" file : -s indica che si miscela un file con se stesso,
qui una volta separa con un tab, l'altra con new-line, in modo da unire le righe a 2 a 2
grep :cerca stringhe
- ps aux | grep netscape : cerca il processo netscape nel sistema
- grep -n -v pattern file : stampa le righe di file che non (-v)
contengono il pattern ,
scrive il numero di linea (-n)
sort : ordina le linee
- w | sort : mostra gli utenti in ordine alfabetico
- w | sort -r : reverse order
- sort -n +3n -t: /etc/passwd : file utenti ordinato in base al
campo 4 (+3n) usando come separatore : (-t:)
ed interpretando il campo come un numero (-n)
uniq : elimina linee doppie
- w | uniq -c : mostra gli utenti in ordine alfabetico, senza ripetizioni;
-c scrive il numero di linee eguali trovate
- w | cut -f1 -d" " | uniq -cd : mostra solo gli utenti con connessioni multiple
-d conserva solo linee multiple
sed : stream editor
Questo programma esegue funzioni di "editing" su un file, sostituendo o eliminando
insiemi di caratteri specificati da un "pattern"
- sed s/pattern/nuovo_pattern/g file > outfile :
sostituisce pattern con /nuovo_pattern, tutte le volte che lo trova in una linea (g) in tutto il file
- sed 2,10s/pattern/nuovo_pattern/ : sostituisce dalla riga 2 alla 10
- sed /pattern/d : elimina linee col pattern
- sed 3,4d file : elimina linee 3 e 4
- sed -n /uno/due/p file : non ha file di output(-n)
sostituisce uno con due e mostra le linee cambiate, ma non produce un file di output (-n)
- sed -n -e 's/a/b/gp' -e 's/c/d/gp' file : cambia a in b , c in d
Patterns di sed
I "pattern" riconosciuti dall'utility sed hanno una sintassi particolare:
- [a-d] [abD3] [A-Za-z] [^abc] : indica un range di caratteri
- * : indica zero o piu' volte
- ? : indica zero o una volta
- + : indica una o piu' volte
- . : indica un carattere qualsiasi
- ^ : inizio linea
- $ : fine linea
- X* : X zero o piu' volte
- X\{10\} : X 10 volte
- X\{1,10\} : X da 1 a 10 volte
- X\{2,\} : X almeno 2 volte
wc : conta linee, caratteri e parole
split : separa un file in piu' files di dato numero linee o caratteri
join: unisce files linea per linea in base a campo comune
tac : ribalta ordine linee in un file
fold: spezza linee lunghe
nl : mette i numeri delle linee
fmt , pr : esegue formattazioni particolari (usati per vecchie stampanti)
expand : trasforma caratteri tab in space
unexpand trasforma caratteri space in tabs
Esempi piu' complessi
- cat file | tr -cs 'a-zA-Z0-9' '[\n*]' | more : una riga per parola
- cat file | tr -cs 'a-zA-Z0-9' '[\n*]' | sort | more : in ordine alfabetico
- who | cut -d" " -f1 | sort | uniq :
mostra chi e' collegato
- kill -9 `ps aux | grep netscape | tr -s ' ' | cut -f2 -d ' ' ` : ferma netscape
- for i in *.ps ; do lpr -Plp10 $i ; done stampa tutti i files postscript nella directory
- (for i in *zip ; do zipinfo $i ; done ) | more mostra il contenuto dei files zip
- cat hist.out | sed 's/ */ /g' | cut -d' ' -f3,4 | graph -TX :
fa un grafico con le colonne 3 e 4 del file hist.out
il sed compatta i bianchi, in modo che le colonne siano separate da un solo bianco e
correttamente separate da cut
-TX indica un output a video X11