-
Notifications
You must be signed in to change notification settings - Fork 0
/
guida.tex
3123 lines (2391 loc) · 98.1 KB
/
guida.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\documentclass[a4paper]{report}
\usepackage{cmap}
\usepackage[utf8]{inputenc}
\usepackage{graphbox}
\usepackage{float}
\usepackage{hyperref}
\usepackage{wrapfig}
\usepackage[italian]{babel}
\usepackage{multicol}
\usepackage{titlesec}
\usepackage{tabu}
\usepackage{fix-cm}
\usepackage[margin=2cm]{geometry}
\usepackage[pages=some]{background}
\usepackage{listings}
\usepackage{tcolorbox}
\usepackage{pdfpages}
\graphicspath{ {images/} }
% Cambio il nome ai titoletti
\renewcommand{\chaptername}{Capitolo}
\renewcommand{\contentsname}{Contenuti}
\renewcommand{\abstractname}{}
\renewcommand{\bibname}{Bibliografia}
\renewcommand{\figurename}{Figura}
\renewcommand{\tablename}{Tabella}
% Regole di formattazione
\newcommand\tstrut{\rule{0pt}{2.4ex}}
\newcommand\bstrut{\rule[-1.0ex]{0pt}{0pt}}
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\setlength\parindent{0pt}
\newcommand{\setuptext}{
\fontsize{12}{14}\selectfont
\setlength{\parskip}{0.4cm}
\titlespacing{\section}{0pt}{*2}{*0}
}
% Definisco il titolone
\makeatletter
\newcommand\HUGE{\@setfontsize\Huge{50}{60}}
\makeatother
% Definisco i Riquadri colorati
\definecolor{darkgreen}{rgb}{0.000, 0.392, 0.000}
\definecolor{darkred}{rgb}{0.502, 0.000, 0.000}
\newenvironment{ricordati}{\begin{tcolorbox}[fonttitle=\sffamily\bfseries\large,title=Ricordati,colframe=orange!75!white]}{\end{tcolorbox}}
\newenvironment{info}{\begin{tcolorbox}[fonttitle=\sffamily\bfseries\large,title=Info,colframe=blue!75!white]}{\end{tcolorbox}}
\newenvironment{funzioni}{\begin{tcolorbox}[fonttitle=\sffamily\bfseries\large,title=Funzioni Utili,colframe=darkgreen!75!white]}{\end{tcolorbox}}
\newenvironment{pattern}{\begin{tcolorbox}[fonttitle=\sffamily\bfseries\large,title=Pattern Ricorrenti,colframe=darkred!75!white]}{\end{tcolorbox}}
\newenvironment{code}{\begin{tcolorbox}[size=small]}{\end{tcolorbox}}
% Imposto il Syntax Highlighting
\lstset{
language=bash
}
\lstset{
morekeywords={man,ls,cd,pwd,df,du,rm,cp,mv,ln,mkdir,rmdir,sort,head,tail,find,ip,sudo,ifup,systemctl,grep,egrep}
}
\lstset{basicstyle=\ttfamily,
showstringspaces=false,
commentstyle=\color{red},
keywordstyle=\color{blue},
}
% Invoco lo script python per generare automaticamente gli snippet
% RICORDARSI DI ABILITARE L'OPZIONE: -enable-write18
\immediate\write18{python ./snippetbuilder.py}
\begin{document}
% COPERTINA
\begin{titlepage}
\centering
\large
A cura di Federico Terzi e Massimo Schembri - Ultima revisione: \today
\noindent\rule{15cm}{0.2pt}
\vspace{4cm}
\HUGE
\textbf{LAS}
\huge
Guida pratica per l'esame di laboratorio
\vspace{2cm}
\includegraphics[width=0.9\linewidth]{cover}
\vspace{3cm}
\normalsize
\url{https://github.com/federico-terzi/las-guida-pratica}
\clearpage
\end{titlepage}
% INTRODUZIONE
\renewcommand{\abstractname}{}
\begin{abstract}
\section*{Introduzione}
Ho deciso di scrivere questa guida per unire una miriade di appunti sparsi trovati in rete, nelle slide e in laboratorio in modo da rendere più facile il superamento dell'esame di LAS.
Pur non essendo esaustiva in ogni aspetto, la guida parla della maggior parte delle tematiche affrontate in laboratorio, soffermandosi sui problemi più comuni.
\section*{Contribuire alla guida}
Se ritieni di poter migliorare la guida o hai trovato un errore, visita la repository GitHub ed apri una \textit{issue}, oppure inviami un messaggio. Ogni contributo è ben accetto :)
\vspace{4mm}
Link Repository: \url{https://github.com/federico-terzi/las-guida-pratica}
\vspace{5mm}
\begin{figure}[htb!]
\centering
\includegraphics[width=4cm]{qr}
\caption{QR Code alla repository di GitHub}
\end{figure}
\section*{Fonti}
\begin{itemize}
\item Molto materiale è tratto dalle slide del Prof. Marco Prandini che sono liberamente disponibili a questo indirizzo: \url{http://lia.disi.unibo.it/Courses/AmmSistemi1718/}
\item Il \textit{cheat sheet} regex alla fine è tratto dal sito: \url{http://addedbytes.com}
\end{itemize}
\end{abstract}
% INDICE
\normalsize
\tableofcontents
% Define the automatic title link button
\titleformat{\section}[hang]{\normalfont\Large\bfseries}{\thesection }{1em}{\addlink}
\titleformat{\subsection}[hang]{\normalfont\large\bfseries}{\thesubsection }{1em}{\addlink}
\newcommand{\addlink}[1]{#1 \href{./snippets/\thesubsection.txt}{\includegraphics[ width=0.4cm]{open}}}
\chapter{Linguaggio Bash}
\section{Variabili speciali}
All'interno di uno script bash è possibile utilizzare una serie di variabili built-in:
\begin{table}[h]
\centering
\begin{tabular}{ll}
\$\$ & PID dello script bash corrente \\
\$\# & Numero di argomenti da riga di comando \\
\$? & Exit value dell'ultimo comando eseguito command. \\
\$ & PID della shell \\
\$! & PID dell'ultimo comando eseguito in background \\
\$0 & Nome script search. \\
\$n & N-esimo argomento posizionale. Il massimo numero è 9 \\
\$*, \$@ & Tutti gli argomenti passati. \\
"\$*" & Tutti gli argomenti in un unica stringa "\$1 \$2 ...". I valori sono separati da \$IFS. \\
"\$@" & Tutti gli argomenti, separati individualmente ("\$1" "\$2" …).
\end{tabular}
\end{table}
\section{Escaping degli apici}
Nella shell bash, i singoli apici e i doppi apici assumo significati particolari e ben distinti:
\begin{itemize}
\item \textbf{Singoli apici:} Preservano tutto il contenuto, senza effettuare alcuna valutazione.
\item \textbf{Doppi apici:} Preservano il contenuto, ad eccezione dei caratteri: \texttt{\$, `, \textbackslash, !} che vengono invece interpretati.
\end{itemize}
\begin{code}
\begin{lstlisting}
USER=pippo
echo "Ciao $USER" # Stampa: Ciao pippo
echo 'Ciao $USER' # Stampa: Ciao $USER
echo "$(echo ciao)" # Stampa: ciao
echo '$(echo ciao)' # Stampa: $(echo ciao)
\end{lstlisting}
\end{code}
\begin{info}
Un interessante proprietà degli apici è che possono essere concatenati in un unica stringa. Questo può essere molto utile per formare argomenti che includono variabili esterne ma che vanno anche protetti.
\begin{lstlisting}
echo "ciao"'ciao' # Stampa: ciaociao
USER=pippo
echo "ciao $USER"'ciao $USER' # Stampa: ciao pippociao $USER
# Esempio un po' piu complesso:
ssh "$1" "echo $2 $3 > "'/tmp/$(echo $SSH_CLIENT | cut -f1 -d" ")'
\end{lstlisting}
\end{info}
\section{Lettura Argomenti posizionali}
Per leggere gli argomenti posizionali, è possibile utilizzare la notazione \texttt{\$1}, \texttt{\$2}, ecc.
\begin{code}
\begin{lstlisting}
# Stampo il primo argomento
# Invoco il comando come: ./script.sh ciao
echo "Il primo argomento e' $1" # Output: Il primo argomento e' ciao
\end{lstlisting}
\end{code}
Un utilizzo interessante degli argomenti posizionali è l'utilizzo di \texttt{\$0} per ottenere il nome del file bash corrente. Questo può essere utile per chiamarlo ricorsivamente.
\section{Lettura Argomenti variabili}
Può capitare di dover leggere un numero di argomenti variabili. Il miglior modo per farlo è utilizzare \texttt{\$@} all'interno di un ciclo \texttt{for}
\begin{code}
\begin{lstlisting}
# Stampo tutti gli argomenti
for arg in "$@" ; do
echo $arg
done
\end{lstlisting}
\end{code}
\begin{info}
Da notare un paio di cose:
\begin{itemize}
\item I doppi apici intorno a \texttt{"\$@"}, che permettono di proteggere l'espansione da effetti indesiderati
\item \texttt{\$@} permette di ottenere anche gli argomenti che contengono degli spazi, a patto che durante la chiamata siano stati utilizzati i doppi apici. Esempio: \texttt{./script.sh "ciao ciao" test} produrrà due argomenti: "ciao ciao" e "test".
\end{itemize}
\end{info}
\subsection{Lettura Argomenti variabili tramite array}
È anche possibile leggere gli argomenti trasferendoli direttamente in un array:
\begin{code}
\begin{lstlisting}
declare -a ARGS # Dichiaro l'array
# Riempio l'array con gli argomenti
ARGS=("$@")
# Ciclo tra tutti gli elementi
for index in ${!ARGS[@]} ; do
ARG=${ARGS[$index]} # Elemento corrente
done
\end{lstlisting}
\end{code}
\section{Assegnamento condizionale ad una variabile}
A volte può essere comodo dare dei valori di default alle variabili, in caso non sia stato passato l'argomento corrispondente:
\begin{code}
\begin{lstlisting}
# Se $1 non e' specificato, setta la variabile a "pippo"
NOME=${1:-"pippo"}
# Se HOME non e' settata o e' nulla, la setta a /tmp
cd ${HOME:=/tmp}
# Stampa un errore ed esce se $2 non e' definito
NOME=${2:?"Errore, due non definito"}
\end{lstlisting}
\end{code}
\section{\texttt{getopts}: Definire opzioni da riga di comando}
\texttt{getopts} permette di definire delle opzioni da riga di comando, utilizzabili in uno script bash.
Il fulcro del meccanismo è definire la stringa delle opzioni, ad esempio: \texttt{"ab:"}. In questo caso, visto che \texttt{b} è seguita da \texttt{":"}, \texttt{getopts} si aspetta che \textbf{debba avere anche un valore}, che verrà poi salvato nella variabile \texttt{\$OPTARG}.
Se volessimo che anche \texttt{a} abbia un valore, la stringa diventerebbe: \texttt{"a:b:"}
Segue un esempio:
\begin{code}
\begin{lstlisting}
#!/bin/bash
aflag=
bflag=
bval=
while getopts 'ab:' OPTION ; do
case $OPTION in
a) aflag=1
;;
b) bflag=1
bval="$OPTARG"
;;
?) echo "Errore argomenti"
exit 2
esac
done
# Per ottenere gli argomenti, shifto via le opzioni
shift $(($OPTIND - 1))
if [ "$aflag" ] ; then
echo "Fai qualcosa con a"
fi
if [ "$bflag" ] ; then
echo "B valeva: $bval"
fi
\end{lstlisting}
\end{code}
\begin{ricordati}
Le opzioni di \texttt{getopts} devono essere \textbf{monocarattere}, ovvero le opzioni estese non sono supportate.
\end{ricordati}
\section{Piping e Ridirezione}
Ogni comando unix ha la possibilità di interagire con il sistema attraverso tre flussi:
\begin{itemize}
\item Standard Input: Flusso di dati in ingresso
\item Standard Output: Flusso di dati in uscita
\item Standard Error: Flusso di dati in uscita \textbf{che indicano un errore}
\end{itemize}
\subsection{Pipe}
Su unix è possibile ridirigere il flusso di dati in uscita da un processo all'ingresso di un altro e, per farlo, si usa una \textbf{pipe}.
La pipe viene indicata con la barra verticale \texttt{|} e si interpone tra i due processi comunicanti, ad esempio:
\begin{code}
\begin{lstlisting}
# Legge il file ciao.txt e ne inoltra il contenuto al comando less,
# che ne mostra il contenuto in maniera progressiva
cat ciao.txt | less
\end{lstlisting}
\end{code}
\begin{info}
Se si vuole inviare in piping anche lo standard error di un comando, si può utilizzare \texttt{2>\&1} in questo modo:
\begin{lstlisting}
# Inoltra sia lo standard output che lo standard error a less
ls 2>&1 | less
\end{lstlisting}
\end{info}
\subsection{Ridirezione su file}
Per salvare l'output di un comando in un file, si può utilizzare la ridirezione:
\begin{code}
\begin{lstlisting}
# Salvo il risultato del comando ls nel file ciao.txt
ls > ciao.txt
# Come nel caso precedente, ma in APPEND al file
ls >> ciao.txt
\end{lstlisting}
\end{code}
\subsection{Ridirigere lo standard error}
Nel caso in cui si voglia salvare su file lo standard error in uscita da un comando, si può utilizzare la sintassi: \texttt{2>} oppure \texttt{2>>}
\begin{code}
\begin{lstlisting}
# Salvo il risultato del comando ls nel file ciao.txt
# ed eventuali errori nel file errori.txt
ls > ciao.txt 2> errori.txt
\end{lstlisting}
\end{code}
\begin{info}
Nel caso in cui si voglia unire lo standard output allo standard error, si può usare la sintassi: \texttt{2>\&1}
\begin{lstlisting}
# Salvo sia lo standard output che lo standard error nel file ciao.txt
ls > ciao.txt 2>&1
\end{lstlisting}
\end{info}
\subsection{\texttt{/dev/null}: Sopprimere l'output di un comando}
Può essere comodo sopprimere l'output di un comando per non mostrarlo a video. Per farlo, si può redirigere il flusso dello standard output al file \texttt{/dev/null}
\begin{code}
\begin{lstlisting}
# Sopprimo l'output del comando
ls 1>/dev/null
\end{lstlisting}
\end{code}
\begin{info}
Analogamente si può sopprimere lo standard error:
\begin{lstlisting}
# Sopprimo lo standard error del comando ( ma stampo l'output )
ls 2>/dev/null
\end{lstlisting}
\end{info}
% TODO: aggiungere 12 passi espansione shell
\chapter{Comandi di Base}
In questo capitolo verranno spiegati i principali comandi utilizzati nella shell linux.
\section{\texttt{ls}: Elenca i file in una directory}
Permette di elencare i file o il contenuto della directory specificata ( se non specificata, directory corrente ).
\begin{code}
\begin{lstlisting}
ls # Elenca il contenuto della directory corrente
\end{lstlisting}
Prevede molte opzioni:
\begin{lstlisting}
-l # Abbina al nome le informazioni associate al file
-h # Mostra la dimensione del file in versione piu leggibile
-a # Mostra tutto ( includendo anche i file che iniziano con . )
-A # Come -a, ma escludendo .. e .
-R # Percorre ricorsivamente la gerarchia
-r # Inverte l'ordine dell'elenco
-t # Ordina i file in base all'ora di modifica ( dal piu recente )
-i # Indica gli i-number dei file
-F # Aggiunge alla fine del filename * agli eseguibili e / ai direttori
-d # Mostra le informazioni di un direttorio senza listare contenuto.
-X # Lista alfabeticamente in base all'estensione
--full-time # Mostra la data di modifica completa (data, ora, sec, ecc)
\end{lstlisting}
\end{code}
\subsection*{Ordinare i file}
Il comando \texttt{ls} offre la possibilità di ordinare i file secondo vari criteri, specificando l'argomento \texttt{--sort}
\begin{code}
\begin{lstlisting}
ls --sort=extension # Ordina in base all'estensione
ls --sort=size # Ordina in base alla dimensione del file
ls --sort=time # Ordina in base alla data di ultima modifica
\end{lstlisting}
L'ordine può essere invertito utilizzando l'argomento \texttt{-r}
\end{code}
\section{\texttt{cd}: Cambiare il direttorio corrente}
Serve per navigare all'interno dei direttori. Può essere utilizzato in vari modi:
\begin{code}
\begin{lstlisting}
cd # Torna nella home dell'utente corrente
cd /path/della/directory # Naviga nel path "/path/della/directory"
cd .. # Naviga nel direttorio padre
cd - # Torna nel direttorio precedente
\end{lstlisting}
\end{code}
\begin{info}
In caso abbiate appena creato una directory, è molto comoda la sintassi:
\begin{lstlisting}
mkdir ciao # Crea la directory
cd !$ # Entra nella directory appena creata
\end{lstlisting}
\end{info}
\section{\texttt{ln}: Creare collegamenti a file o direttori}
\begin{code}
\begin{lstlisting}
# Crea un hardlink
ln /path/to/file /path/to/hardlink
# Crea un link simbolico
ln -s /path/to/file /path/to/link
\end{lstlisting}
\end{code}
\section{\texttt{printf}: Stampare i testi formattati}
Utilizzando il comando \texttt{printf} è possibile stampare dei testi formattati in maniera analoga alla funzione C omonima.
\begin{code}
\begin{lstlisting}
# La sintassi del comando e' la seguente:
printf <FORMATO> <ARGOMENTI>
# Output: Nome: pippo, eta: 16
printf "Nome: %s, eta: %d" pippo 16
\end{lstlisting}
\end{code}
\texttt{printf} supporta una notevole quantità di formati, i principali sono:
\begin{itemize}
\item \texttt{\%s} Stringa
\item \texttt{\%d} Intero
\item \texttt{\%x} Intero in forma esadecimale
\item \texttt{\%o} Intero in forma ottale
\item \texttt{\%f} Float, con precisione di 6 caratteri
\end{itemize}
\section{\texttt{pwd}: Ottenere il percorso del direttorio corrente}
Utilizzato per stampare a video il direttorio corrente, ad esempio:
\begin{code}
\begin{lstlisting}
pwd # Stampa in output il percorso assoluto del direttorio corrente
\end{lstlisting}
\end{code}
\section{\texttt{du}: Visualizzare l'uso di spazio di un file o directory}
Viene utilizzato per ottenere informazioni riguardo all'uso di spazio da parte di un file o di una cartella.
\begin{code}
\begin{lstlisting}
du /path/directory # Stampa la dimensione di ogni nodo dell'albero
\end{lstlisting}
Opzioni principali:
\begin{lstlisting}
-h # Mostra le dimensioni in modo facilmente leggibile
-s # Mostra il sommario ( totale ) della directory
--max-depth # Massima profondita' di esplorazione
--exclude="*.txt" # Esclude tutti i file che rispettano il pattern.
# NON supporta le regular expressions
\end{lstlisting}
\end{code}
\begin{info}
Alcuni esempi d'uso con altri comandi:
\begin{lstlisting}
# Mostra i 10 file piu voluminosi nel direttorio corrente
du | sort -nr | head -10
\end{lstlisting}
\end{info}
\section{\texttt{find}: Trovare un file}
Permette di trovare file e directory all'interno del sistema, in base ad un gran numero di opzioni.
\begin{code}
\begin{lstlisting}
# Trovare tutti i file che finiscono per .txt nella directory specificata
find /percorso/directory -name *.txt
# Trovare tutti i file con dimensione superiore a 100k
find -size +100k
# Trovare tutti i file dell'utente las
find -user las
# Trovare tutti i file del gruppo las
find -group las
# Trovare tutti i direttori
find -type d
\end{lstlisting}
\end{code}
\subsection*{Cercare in base ai permessi}
\begin{code}
\begin{lstlisting}
# Trovare tutti i file che possono essere eseguiti dal proprietario
# e dal gruppo.
find -type f -perm -110
# Trovare tutti i file che hanno esattamente il permesso 110
find -type f -perm /110
\end{lstlisting}
\end{code}
\subsubsection*{Qual'è la differenza tra i due?}
La differenza tra i due è che il primo controlla che un file rispetti quelle condizioni, \textbf{ma non impone niente sulle altre}. Verrebbero anche indicati i file con permessi di lettura e scrittura.
Il secondo invece controlla che i permessi del file siano \textbf{esattamente} quelli specificati.
\subsection*{Eseguire un comando per ogni risultato}
\begin{code}
\begin{lstlisting}
# Stampare le informazioni di ogni file trovato tramite ls
find . -exec ls -lh {} +
# Un altro modo per realizzare questo meccanismo e' utilizzare xargs
find . | xargs ls -lh
\end{lstlisting}
\end{code}
\begin{info}
Per cercare i file che contengono un particolare contenuto di file, vedere il comando \texttt{grep} con opzione \texttt{-Rl}
\end{info}
\subsection*{Effettuare una ricerca con regex}
\begin{code}
\begin{lstlisting}
# Cercare tutti i file il cui nome finisce con .jpg, con una regex egrep
find . -regextype posix-egrep -regex '.*\.jpg'
\end{lstlisting}
\end{code}
\subsection*{Combinare le opzioni}
Le opzioni possono essere combinate con operazioni logiche di AND, OR e NOT.
\begin{code}
\begin{lstlisting}
# NOT: basta aggiungere ! prima dell'opzione.
# Trovare tutti i file che non finiscono per .txt
find ! -name *.txt
# AND: basta inserire due comandi, sono automaticamente messi in AND.
# Trovare tutti i file con dimensione superiore a 100k e
# che finiscono per .txt
find -size +100k -name *.txt
# OR: bisogna inserire l'opzione -o prima del secondo comando
# Trovare tutti i file dell'utente las o che finiscono per .txt
find -user las -o -name *.txt
\end{lstlisting}
\end{code}
\section{\texttt{history}: Richiamare comandi passati}
Per visualizzare la lista dei comandi eseguiti precedentemente, può essere utilizzato il comando \texttt{history}. A quel punto, basta ricordarsi il numero a fianco del comando desiderato e digitare:
\begin{lstlisting}
!NUMERO # Ad esempio: !5
\end{lstlisting}
\subsection*{Ricerca interattiva tramite \texttt{CTRL + R}}
Per cercare interattivamente attraverso la history è possibile utilizzare la scorciatoia: \texttt{CTRL + R}
Questa mostrerà il comando più recente che contiene il termine di ricerca e premendo nuovamente \texttt{CTRL + R} sarà possibile cercare a ritroso nella cronologia.
\section{\texttt{man}: Leggere la documentazione di un comando}
Il comando \texttt{man} permette di consultare la documentazione di un qualunque comando linux.
Per utilizzarlo, bisogna digitare nel terminale:
\begin{code}
\begin{lstlisting}
man <NOME_COMANDO>
\end{lstlisting}
\end{code}
\subsection*{Sezioni del \texttt{man}}
Il \texttt{man} contiene varie sezioni di interesse per differenziare omonimi appartenenti a contesti diversi.
Le sezioni principali sono:
\begin{enumerate}
\setlength{\itemsep}{0pt}
\item User commands
\item Chiamate al sistema operativo
\item Funzioni di libreria
\item File speciali (/dev/*)
\item Formati dei file, protocolli e strutture C
\item Giochi
\item Macro, header, filesystem, concetti generali
\item Comandi amministrativi riservati a root
\end{enumerate}
\begin{code}
Per visualizzare l'entry di una particolare sezione, il formato sarà:
\begin{lstlisting}
man <NUMERO_SEZIONE> <NOME_COMANDO>
\end{lstlisting}
È anche possibile cercare contemporaneamente in tutte le sezioni, digitando:
\begin{lstlisting}
man -a <NOME_COMANDO>
\end{lstlisting}
\end{code}
\chapter{Filtri}
\section{\texttt{grep}: Filtrare le righe in input che rispettano un pattern }
\texttt{grep} è uno strumento estremamente potente per filtrare e cercare dei pattern all'interno di file o dello standard input.
Possiede anche un \textit{fratello maggiore}, \texttt{egrep}, totalmente compatibile con \texttt{grep} ma con l'aggiunta del supporto alle \textit{regex}.
Opzioni:
\begin{code}
\begin{lstlisting}
-v # Inverti il match ( escludi le righe che soddisfano il pattern )
-c # Conteggio del numero di righe che soddisfano il pattern
-i # Effettua la ricerca CASE-INSENSITIVE
-w # Cerca parole intere e NON sottostringhe
-l # Mostra solo i nomi dei file ( senza righe con match )
-n # Mostra i numeri di riga dei match
-o # Mostra solo la stringa che fa match, e non la riga intera
-B <N> # Stampa anche le N righe precedenti al match
-A <N> # Stampa anche le N righe successive al match
--line-buffered # Disabilita l'output buffer e stampa subito le righe
\end{lstlisting}
\end{code}
\subsection{Filtrare le righe che contengono un pattern}
\begin{code}
\begin{lstlisting}
# Stampo le righe di un file che contengono la parola "ciao"
grep -e "ciao" filename.txt
# Completamente equivalente a questo
cat filename.txt | grep -e "ciao"
# Utilizzando egrep e' possibile utilizzare le regex per la ricerca
# Cerca tutte le righe che iniziano con "ciao"
egrep -e "^ciao.*" filename.txt
\end{lstlisting}
\end{code}
\subsection{Usare grep in un if, per verificare se una variabile rispetta un pattern}
Il valore di ritorno di \texttt{grep} è 0 il pattern è stato trovato, 1 altrimenti. E' quindi possibile inserirlo direttamente in un if per verificare un pattern. In questo caso tuttavia è comoda l'opzione \texttt{-q} che permette di \textbf{non} stampare a video l'output di grep.
\begin{code}
\begin{lstlisting}
A=ciaone
# Controllo se la variabile A contiene "ciao"
if echo $A | grep -q "ciao" ; then
echo A contiene ciao
fi
\end{lstlisting}
\end{code}
\subsection{Cercare ricorsivamente i file che contengono un pattern}
Uno degli usi più comuni di \texttt{grep} è quello di effettuare una ricerca ricorsiva per trovare tutti i file che contengono un particolare pattern.
\begin{code}
\begin{lstlisting}
# Elenca tutti i file che contengono "ciao" analizzando
# ricorsivamente il direttorio corrente.
grep -r "ciao" .
# Per restituire solo i nomi dei file senza le righe
# che fanno match, usare l'opzione -l
grep -r -l "ciao" .
\end{lstlisting}
\end{code}
\section{\texttt{egrep}: Filtrare le righe in input con le REGEX}
\texttt{egrep} è il \textit{fratello maggiore} di \texttt{grep} e, pur rimandendo compatibile con suoi comandi e opzioni, aggiunge il supporto alle \textbf{regex}.
Esempio:
\begin{code}
\begin{lstlisting}
# Elenca le righe esattamente uguali a "ciao" nel file ciao.txt
egrep '^ciao$' ciao.txt
\end{lstlisting}
\end{code}
\begin{info}
In fondo alla guida è incluso un \textbf{cheat sheet} Regex, molto comodo per costruire le varie espressioni.
\end{info}
\section{\texttt{cut}: Estrarre parti di righe}
Il comando \texttt{cut} permette di estrarre parti di righe.
\subsection{Estrarre range di caratteri}
\begin{code}
\begin{lstlisting}
# Restituisci il decimo carattere di ogni riga del file
cut -c10 file.txt
# Restituisci i caratteri dal quinto al decimo
cut -c5-10 file.txt
# Restiuisci i caratteri dall'inizio fino al 20esimo
cut -c-20 file.txt
# Resituisci i caratteri dal quinto in poi
cut -c5- file.txt
\end{lstlisting}
\end{code}
\subsection{Estrarre dei campi da una riga}
\texttt{cut} può essere utilizzato per estrarre dei campi da una riga se questi sono separati da un carattere:
\begin{code}
\begin{lstlisting}
cut -d<carattere_delimitatore> -f<elenco_campi>
# Estraggo il primo campo, separati da una virgola
cut -d, -f1
# Estraggo il primo ed il terzo campo, separati da uno spazio
cut -d' ' -f1,3
\end{lstlisting}
\end{code}
\begin{info}
Aggiungendo l'opzione \texttt{-s} a \texttt{cut}, si possono escludere tutte le righe che non contengono il delimitatore.
\end{info}
\begin{info}
Se si vogliono estrarre dei campi da una riga, può essere più comodo utilizzare il comando \texttt{awk}
\end{info}
\section{\texttt{sort}: Ordinare le righe}
Per ordinare una serie di righe di un file ( o ricevute dallo standard input ), si può utilizzare il comando \texttt{sort}:
\begin{code}
\begin{lstlisting}
# Ordina alfabeticamente le righe del file
sort file.txt
# Ordina numericamente le righe del file
sort -n file.txt
# Ordina le righe del file ed elimina i duplicati
sort -u file.txt
# Ordina in ordine inverso
sort -r file.txt
\end{lstlisting}
\end{code}
\texttt{sort} può anche essere utilizzato per ordinare delle righe secondo dei campi e non l'intera riga:
\begin{code}
\begin{lstlisting}
sort -t<delimitatore> -k <campo>,<campo>[n]
# Ordina degli indirizzi IP
sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n
\end{lstlisting}
\end{code}
\section{\texttt{uniq}: Rimuovere i duplicati ( contigui )}
Il comando \texttt{uniq} permette di rimuovere le righe duplicate \textbf{contigue}.
\begin{code}
\begin{lstlisting}
# Elimina i duplicati CONTIGUI
uniq
# Indica il numero di occorrenze per ogni duplicato
uniq -c
# Mostra SOLO i duplicati
uniq -d
\end{lstlisting}
\end{code}
\begin{info}
È importante ricordarsi che \texttt{uniq} \textbf{non ha memoria}, questo implica che le righe, per essere rilevate come duplicate, devono essere \textbf{contigue}. Ad esempio:
\begin{lstlisting}
ciao
pippo
ciao
\end{lstlisting}
Verrebbe lasciato passare inalterato da \texttt{uniq}, perchè i due \texttt{ciao} non sono contigui.
\end{info}
\section{\texttt{head}: Mostra le prime N righe di un file}
\begin{code}
\begin{lstlisting}
# Mostra solo le prime 2 righe del file
head -2 file.txt
# Mostra solo i primi 5 caratteri del file
head -c 5 file.txt
\end{lstlisting}
\end{code}
\section{\texttt{tail}: Mostra le ultime N righe di un file}
\begin{code}
\begin{lstlisting}
# Mostra le ultime 3 righe del file
tail -3 file.txt
\end{lstlisting}
\end{code}
\begin{info}
Può essere molto comoda l'opzione \texttt{-f} che permette di lasciare aperto un file e di visualizzare in tempo reale le aggiunte ad esso.
A riguardo, è comodo un altro \textit{trucchetto} nel caso sia necessario visualizzare solo le righe che sono state aggiunte dall'avvio del comando in poi, e \textbf{non quelle già presenti nel file}:
\begin{lstlisting}
# Non leggo nessuna riga dal file, ma ricevo quelle nuove
tail -n 0 -f file.txt
\end{lstlisting}
Inoltre può anche essere utile che \texttt{tail} termini quanto un altro processo termina, per questo usare l'opzione \texttt{--pid}
\begin{lstlisting}
# Continua a leggere fino a che il processo 1234 non termina
tail -f --pid 1234
\end{lstlisting}
\end{info}
\section{\texttt{sed}: String Replace}
\begin{code}
\begin{lstlisting}
# Sostituisci la prima occorrenza di pippo con pluto per ogni riga
sed 's/pippo/pluto/' file.txt
# Sostituisci TUTTE le occorrenze di pippo con pluto
sed 's/pippo/pluto/g' file.txt
# Sostituisci tutte le occorrenze di pippo con pluto CASE INSENSITIVE
sed 's/pippo/pluto/gi' file.txt
# Aggiungi all'inizio di ogni riga "INIZIO: "
sed 's/^/INIZIO:/' file.txt
\end{lstlisting}
\end{code}
\section{\texttt{awk}: Estrarre campi da una riga}
\texttt{awk} è come \texttt{cut}, ma sotto steroidi. Permette di estrarre dei campi da una riga usando stringhe arbitrarie come separatori.
\begin{code}
\begin{lstlisting}
# Estrai il primo campo dalla riga, separato da uno spazio
awk '{ print $1 }'
# Estraggo il secondo campo, separato da una virgola
awk -F "," '{ print $2 }'
# Esempio di estrazione piu' complessa:
# INPUT: campo1=pippo campo2=pluto
# Vogliamo estrarre "pippo"
awk -F "campo1=" '{ print $2 }' | awk -F "campo2=" '{ print $1 }'
\end{lstlisting}
\end{code}
\begin{info}
In caso si vogliano filtrare dei campi in \textbf{real-time}, può essere comoda l'opzione \texttt{-W interactive} che evita il buffering.
\end{info}
\chapter{Processi e Segnali}
\section{\texttt{ps}: Ottenere informazioni sui processi attivi}
Il comando \texttt{ps} permette di ottenere tutte le informazioni legate ai processi correntemente in esecuzione.
Principali opzioni:
\begin{code}
\begin{lstlisting}
ax # Visualizza tutti i processi, anche non propri
u # Mostra gli utenti proprietari del processo
w # Visualizza la riga di comando completa che
# ha originato il processo
f # Visualizza i rapporti di discendenza tra i processi
-p # Solo il processo con questi pid
\end{lstlisting}
\end{code}
\subsection{Ottenere le informazioni a partire dal PID}
\texttt{ps} permette di specificare uno o più PID relativi ai processi da visualizzare.
\begin{code}
\begin{lstlisting}
# Visualizza le informazioni relative al processo con PID=1234
ps -p 1234
# Visualizza le informazioni relative a piu processi
ps -p 1234,1235
\end{lstlisting}
\end{code}
\subsection{Ottenere le informazioni a partire dal comando}
A volte può essere più comodo cercare un processo a partire dal suo comando.
\begin{code}
\begin{lstlisting}
# Visualizza le informazioni relative al processo chrome
ps -C chrome
\end{lstlisting}
\end{code}
\subsection{Ottenere le informazioni dall'utente che l'ha lanciato}
Utilizzando l'opzione \texttt{U} è possibile visualizzare tutti i processi di un dato utente.
\begin{code}
\begin{lstlisting}
# Visualizza i processi dell'utente pippo
ps U pippo
# Visualizza i processi di pippo e pluto
ps U "pippo pluto"
\end{lstlisting}
\end{code}
\section{Segnali}
I segnali sono uno strumento che permette a due processi di comunicare. Un processo può infatti inviare ad un altro un segnale che lo avvisa di un determinato evento.
Inoltre, un processo può \textit{registrare} presso il sistema operativo un \textit{handler} apposito che, quando viene ricevuto il segnale associato, viene eseguito.