Sono un principiante di Bash ma sto cercando di imparare questo strumento per avere un lavoro nei computer uno di questi giorni.Bash: descrittori di file
Sto cercando di insegnare a me stesso i descrittori di file ora. Permettetemi di condividere alcuni dei miei esperimenti:
#!/bin/bash
# Some dummy multi-line content
read -d '' colours <<- 'EOF'
red
green
blue
EOF
# File descriptor 3 produces colours
exec 3< <(echo "$colours")
# File descriptor 4 filters colours
exec 4> >(grep --color=never green)
# File descriptor 5 is an unlimited supply of violet
exec 5< <(yes violet)
echo Reading colours from file descriptor 3...
cat <&3
echo ... done.
echo Reading colours from file descriptor 3 again...
cat <&3
echo ... done.
echo Filtering colours through file descriptor 4...
echo "$colours" >&4
echo ... done. # Race condition?
echo Dipping into some violet...
head <&5
echo ... done.
echo Dipping into some more violet...
head <&5
echo ... done.
qualche primavera domande in mente come la vedo l'uscita proveniente da quanto sopra:
- fd3 sembra avere "impoverito" dopo "consumo", viene automaticamente chiuso anche dopo il primo utilizzo?
- come è diverso fd3 da una named pipe? (qualcosa che ho già visto)
- quando esattamente si avvia il comando
yes
? su dichiarazione FD? dopo? yes
stop (CTRL-Z
o altro) e riavviare quando è necessario più viola?- come posso ottenere il PID di
yes
? - posso ottenere un elenco di file "attivi"?
- condizioni di gara molto interessanti sul filtraggio tramite fd4, può essere evitato?
yes
si interromperà solo quando Iexec 5>&-
?- importa se chiudo con
>&-
o<&-
?
Mi fermo qui, per ora.
Grazie!
PS: parziali (numerati) le risposte sono bene .. Metto insieme i diversi pezzi e bocconi me .. (anche se una risposta esauriente da una sola persona sarebbe impressionante!)
'1.' ottiene _closed_ da' cat', ah-a! '2.' gotcha' 3.' e '4.' questo non sembra mai" bloccare e aspettare "? 'exec 3 <<(while true; do date '+% H-% M-% S' | tee -a/tmp/log; sleep 1; done); tail -f/tmp/log' '6.' shame! :('7.' mi hai insegnato come' wait' !! 'sleep 5 & pid = $ !; echo before; wait $ pid; echo after' - love it! ** RISPOSTA IMPRESSIONANTE ** !! ** GRAZIE * * !!!! – Robottinosino
Re: "questo non sembra mai bloccare e attendere". Potrebbe bloccarsi alla fine ... quando il kernel decide che ha bufferizzato abbastanza dati nella pipe.Ho cambiato il tuo esempio in modo che venga emesso un po 'di testo spazzatura ogni volta attraverso il ciclo (solo per farlo andare più veloce), e per me è bloccato quando il file '/ tmp/log' deve essere di circa 48 kilobyte. Con solo' date' +% H-% M-% S'' dovrebbe ancora succedere, ci vorrà più tempo :-) – Celada
** D'oro **. Sei ☆ l'uomo ☆ – Robottinosino