3 581
contributi
S3v (discussione | contributi) mNessun oggetto della modifica |
m (correzione) |
||
Riga 70: | Riga 70: | ||
Per esempio in genere è '''sbagliato''' scrivere: | Per esempio in genere è '''sbagliato''' scrivere: | ||
<pre> | <pre> | ||
while read riga < file | while read -r riga < file | ||
do | do | ||
# "$riga" contiene *SEMPRE* la prima riga del file | # "$riga" contiene *SEMPRE* la prima riga del file | ||
Riga 80: | Riga 80: | ||
Mentre quello che si vuole è probabilmente: | Mentre quello che si vuole è probabilmente: | ||
<pre> | <pre> | ||
while read riga | while read -r riga | ||
do | do | ||
# "$riga" contiene sempre una nuova linea del file | # "$riga" contiene sempre una nuova linea del file | ||
Riga 134: | Riga 134: | ||
Equivalentemente, con <code>exec</code>: | Equivalentemente, con <code>exec</code>: | ||
<pre> | <pre> | ||
exec 3> file | exec 3> file # apre il file descriptor in scrittura | ||
comando1 >&3 | comando1 >&3 # usa il file descriptor | ||
comando2 | comando2 | ||
comando3 >&3 | comando3 >&3 # usa il file descriptor | ||
exec 3>&- | exec 3>&- # chiude il file descriptor | ||
</pre> | </pre> | ||
Finché un file descriptor non è chiuso, non è garantita la scrittura sul file, ma la scrittura tramite file descriptor è più efficiente. | Finché un file descriptor non è chiuso, non è garantita la scrittura sul file, ma la scrittura tramite file descriptor è più efficiente. | ||
Riga 145: | Riga 145: | ||
Si noti che <code>exec</code> è equivalente a una redirezione in un blocco, ma la chiusura dei file descriptor aperti dev'essere gestita manualmente. Prima di cambiare quelli standard, per consentirne il successivo ripristino al loro valore originale, vanno salvati in un nuovo file descriptor temporaneo: | Si noti che <code>exec</code> è equivalente a una redirezione in un blocco, ma la chiusura dei file descriptor aperti dev'essere gestita manualmente. Prima di cambiare quelli standard, per consentirne il successivo ripristino al loro valore originale, vanno salvati in un nuovo file descriptor temporaneo: | ||
<pre> | <pre> | ||
exec 3<&0 | exec 3<&0 # apre un nuovo file descriptor per salvare lo standard input | ||
exec < file # sovrascrive lo standard input | exec < file # sovrascrive lo standard input | ||
read riga | read -r riga # legge la prima riga (se esiste) | ||
read riga | read -r riga # legge la seconda riga (se esiste)! (e non di nuovo la prima) | ||
exec <&3 | exec <&3 # assegna nuovamente lo standard input al suo valore precedente | ||
exec 3<&- | exec 3<&- # chiude il nuovo file descriptor | ||
</pre> | </pre> | ||
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: | 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 -r riga < file # legge la prima riga del file (se esiste) | ||
read riga < file # legge sempre la prima riga del file (se esiste)! | read -r riga < file # legge sempre la prima riga del file (se esiste)! | ||
</pre> | </pre> | ||
[[Categoria:Bash]][[Categoria:Bash_Scripting]] | [[Categoria:Bash]][[Categoria:Bash_Scripting]] |
contributi