diff --git a/lpic/101/016-reindirizzamenti.md b/lpic/101/016-reindirizzamenti.md new file mode 100644 index 0000000..6008499 --- /dev/null +++ b/lpic/101/016-reindirizzamenti.md @@ -0,0 +1,61 @@ +# 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. diff --git a/lpic/101/016_reindirizzamenti.md b/lpic/101/016_reindirizzamenti.md deleted file mode 100644 index 6b1b784..0000000 --- a/lpic/101/016_reindirizzamenti.md +++ /dev/null @@ -1,52 +0,0 @@ -# Reindirizzamenti - -In Linux i processi hanno tre canali di comunicazione: `standard input` (`stdin`, il cui *descrittore di file* e'**0**), `standard output` (`stdout`, **1**) e `standard error` (`stderr`, **2**). I canali di comunicazione sono anche accessibili tramite i dispositivi speciali `/dev/stdin`, `/dev/stdout` e `/dev/stderr`. - -## Descrittore di file - -Il simbolo `>` ad esempio permette di reindirizzare lo `stdout` di un processo su un file, - -```bash -cat /proc/cpuinfo > cpu.txt -``` -Per impostazione predefinita, viene reindirizzato solo il contenuto che arriva a *stdout*. Questo perche' il valore numerico del descrittore di file deve essere specificato prima del simbolo `>`. Se non specificato, Bash reindirizza lo *stdout*. Pertanto, usare `>` equivale a scrivere `1>`. Per catturare il contenuto di `stderr` bisognerebbe usare il simbolo `2>`. La destinazione di un descrittore di file e' rappresentata dal simbolo `>&`. Per esempio, `1>&2` reindirizza *stdout* a *stderr*. - -Sia *stderr* che *stdout* vengono reindirizzati alla stessa destinazione con `&>`. Per scartare l'output di un comando o di un file, basta reindirizzarne il contenuto al file speciale `/dev/null`. - -Il simbolo `<` viene utilizzato per reindirizzare il contenuto di un file allo *stdin* di un processo. I dati scorrono da destra a sinistra. - -## Here document e Here String - -Il reindirizzamento del *Here document* consente di digitare del testo su piu' righe che verra' utilizzato come contenuto: - -```bash -cat > file << EOF -> riga 1 -> riga 2 -> riga 3 -> EOF - -cat file -riga 1 -riga 2 -riga 3 - -wc -c << EOF -> Quanti caratteri ci sono in questo documento? -> Non ne ho idea, ma scopriamolo! -> EOF -78 - -cat << EOF > file -> riga 1 -> EOF -``` - -La modalita' di inserimento terminera' non appena sara' inserito il termine di *fine file* (nell'esempio il carattere `EOF`). - -Il metodo *Here string* e' molto simile, ma viene utilizzato il simbolo `>>>` e interessa solo una singola riga : `wc -c <<< "Quanti caratteri in questa stringa?"`. Le stringhe con spazi devono essere racchiuse tra `""` - -```bash -sha1sum <<< $USER -06ad4c901e9f7dfdbf1bc5b01fe5d690686b54a4 - -``` \ No newline at end of file