# Reindirizzamenti In Linux, ogni processo dispone di tre canali di comunicazione standard: - `standard input` (`stdin`, il cui descrittore di file é 0) - `standard output` (`stdout`, il cui descrittore di file é 1) - `standard error` (`stderr`, il cui descrittore di file é 2) Tali canali sono accessibili anche tramite i dispositivi speciali `/dev/stdin`, `/dev/stdout` e `/dev/stderr`. ## Descrittore di file Il simbolo `>` consente di reindirizzare lo stdout di un processo verso un file. Ad esempio, il comando: ```bash cat /proc/cpuinfo > cpu.txt ``` reindirizza il contenuto di `stdout` nel file cpu.txt. Per impostazione predefinita, solo il contenuto che inviato a stdout viene reindirizzato. Questo avviene perché il valore numerico del descrittore di file deve essere specificato prima del simbolo `>`. Se non viene specificato, Bash reindirizza automaticamente stdout. Pertanto, utilizzare `>` equivale a scrivere `1>`. Per catturare il contenuto di `stderr`, è necessario utilizzare il simbolo `2>`. La destinazione di un descrittore di file è rappresentata dal simbolo `>&`. Ad esempio, `1>&2` reindirizza stdout a stderr. Sia `stderr` che `stdout` possono essere reindirizzati alla stessa destinazione utilizzando `&>`. Per scartare l'output di un comando o di un file, è possibile reindirizzarne il contenuto al file speciale `/dev/null`. Il simbolo `<` è utilizzato per reindirizzare il contenuto di un file verso lo `stdin` di un processo. In questo caso, i dati scorrono da destra a sinistra. ## Here Document e Here string Il reindirizzamento tramite `Here Document` consente di inserire del testo su più righe, che verrà utilizzato come contenuto. ```bash cat > file << EOF > riga 1 > riga 2 > riga 3 > EOF cat file riga 1 riga 2 riga 3 ``` La modalità di inserimento termina non appena viene inserito il termine di *fine file*, che nell'esempio è rappresentato dal carattere `EOF`. È possibile utilizzare il Here document anche per fornire input a comandi come `wc`: ```bash wc -c << EOF > Quanti caratteri ci sono in questo documento? > Non ne ho idea, ma scopriamolo! > EOF 78 ``` Il metodo `Here String` è simile, ma utilizza il simbolo `<<<` e si applica solo a una singola riga. Ad esempio: ```bash wc -c <<< "Quanti caratteri in questa stringa?" 36 ``` Le stringhe contenenti spazi devono essere racchiuse tra virgolette doppie.