Bash scripting - file descriptor: differenze tra le versioni

aggiunti here-document e here-string, e nuovi esempi
mNessun oggetto della modifica
(aggiunti here-document e here-string, e nuovi esempi)
Riga 35: Riga 35:


Una pipe (<code>comando1 '''|''' comando2</code>), già trattata nella sezione sulle istruzioni composte, è anch'essa una forma di redirezione, in cui lo standard output di comando1 diventa lo standard input di comando2.
Una pipe (<code>comando1 '''|''' comando2</code>), già trattata nella sezione sulle istruzioni composte, è anch'essa una forma di redirezione, in cui lo standard output di comando1 diventa lo standard input di comando2.
===Redirezioni "here document/string"===
Delle redirezioni particolari dallo standard input sono possibili anche nelle forme:
* '''<<parola''' (''here-document''): legge tutte le righe che seguono, finché ne incontra una corrispondente alla parola scelta, e le invia allo standard input di un comando. Nel testo inviato si applicano le espansioni delle stringhe quotate, e come se tutto il testo fosse quotato, ma le virgolette non sono considerate un carattere speciale (restano: <code>$ \ `</code>, con <code>\</code> a fare da carattere di escape). Se invece la parola è racchiusa tra apici o virgolette (per esempio: '''<<"parola"'''), si annullano tutte le espansioni fino alla chiusura di ''here-document''. Il file descriptor è implicito, ma è equivalente scrivere '''0<<parola''';
* '''<<<stringa''' (''here-string'', non ''POSIX''): invia una stringa e una riga vuota allo standard input di un comando. La stringa può essere espansa e racchiusa tra apici, virgolette o nulla come una stringa qualsiasi, in funzione delle espansioni da attivare. Il file descriptor è implicito, ma è equivalente a scrivere '''0<<<stringa''''.
Per esempio:
<pre>
cat <<EOF
Testo su più righe da inviare a cat
che si limiterà a stamparlo...
Sono permesse anche $VARIABILI, che saranno
espanse come tutte le espansioni attivabili
da $ e permesse in una stringa quotata.
EOF
cat <<'EOF'
Testo su più righe da inviare a cat
che si limiterà a stamparlo...
NON sono permesse $VARIABILI, che se presenti
saranno stampate letteralmente.
EOF
</pre>
Ricorda che, a prescindere dall'indentazione del comando, il testo e la parola (negli esempi: '''EOF''') usata come linea conclusiva devono iniziare sempre a inizio riga. Esiste una sintassi alternativa con <code><<-</code> per ignorare le tabulazioni iniziali del testo, e in tal caso solo la parola dev'essere a inizio riga, ma è sconsigliabile, in quanto alcuni editor potrebbero non preservare il carattere tabulazione e trasformarlo in spazio, e visivamente non si nota differenza tra i due casi.
Pipe e altre concatenazioni da aggiungere al comando utilizzante la redirezione ''here-document'' vanno scritte sulla stessa riga del comando. E, se è possibile scrivere il comando su più righe, quella successiva al comando è considerata la riga dopo la parola che chiude tutto il testo usato per la redirezione ''here-document''.


===Scope della redirezione===
===Scope della redirezione===
Riga 123: Riga 151:
exec 3<&-  # chiude il nuovo file descriptor
exec 3<&-  # chiude il nuovo file descriptor
</pre>
</pre>
si ricordi che invece, senza exec e senza un blocco, una redirezione (di lettura o scrittura senza append) su un singolo comando parte sempre dall'inizio:
si ricordi che invece, senza <code>exec</code> e senza un blocco, una redirezione (di lettura o scrittura senza append) su un singolo comando parte sempre dall'inizio:
<pre>
<pre>
read riga < file # legge la prima riga del file (se esiste)
read riga < file # legge la prima riga del file (se esiste)
3 581

contributi