Bash scripting - file descriptor: differenze tra le versioni

m
correzione
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     # apre il file descriptor in scrittura
exec 3> file # apre il file descriptor in scrittura
comando1 >&3     # usa il file descriptor
comando1 >&3 # usa il file descriptor
comando2
comando2
comando3 >&3     # usa il file descriptor
comando3 >&3 # usa il file descriptor
exec 3>&-       # chiude il file descriptor
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   # apre un nuovo file descriptor per salvare lo standard input
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   # legge la prima riga (se esiste)
read -r riga # legge la prima riga (se esiste)
read riga   # legge la seconda riga (se esiste)! (e non di nuovo la prima)
read -r riga # legge la seconda riga (se esiste)! (e non di nuovo la prima)
exec <&3   # assegna nuovamente lo standard input al suo valore precedente
exec <&3     # assegna nuovamente lo standard input al suo valore precedente
exec 3<&-   # chiude il nuovo file descriptor
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]]
3 581

contributi