# 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.
