3 581
contributi
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) |
contributi