flock
è uno dei modi di interbloccare le operazioni. L'utilità fa parte del set di strumenti util-linux ed è disponibile solo per Linux. Altre utilità, disponibili su una più ampia gamma di piattaforme, sono basate setlock
sull'utilità di Daniel J. Bernstein dal suo pacchetto daemontools:
setlock
da daontoontools
setlock
dall'encore dei daemontools di Bruce Guenter
s6-setlock
dalla s6 di Laurent Bercot
chpst
dalla runit di Gerrit Pape
runlock
dall'autore di Wayne Marshall
setlock
dal mio set di strumenti nosh
Questi strumenti operano con un paradigma leggermente diverso da quello usato nella risposta di M. Kurenkov (uno che flock
può anche impiegare, ma non in quella risposta). Uno invoca il setlock
programma per caricare a catena il comando che deve essere interbloccato. setlock
si apre e blocca il file di blocco e lascia un descrittore di file per esso aperto nel suo processo. Il blocco persiste per tutto il processo (a meno che il comando successivo concatenato rilasci esplicitamente il blocco trovando e chiudendo il descrittore di file aperto).
Per il caso nella domanda, è necessario interbloccare il comando che produce la linea di output, tenendo presente che ciò invoca un comando esterno echo
al posto di un echo
comando incorporato della shell :
setlock mylockfile echo "$ RESULT" >> ./$TEMP_DIR/$OUT_FILE
In questo caso non è necessario interbloccare l'apertura del file di output in modalità append. Se lo fosse, si dovrebbe aprire quel file all'interno del blocco, il che richiede l'utilizzo di programmi come fdredir
/ redirfd
:
setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$ RESULT"
quale si può trasformare in una funzione shell se si desidera:
outfile () {setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "$ @"; }
[…]
Eco del file "$ RESULT"
o attenersi alla sintassi della shell e farla interpretare da una seconda shell in esecuzione sotto l'interblocco, che richiede alcune quotazioni non banali se le variabili della propria shell non vengono esportate come variabili di ambiente:
setlock mylockfile sh -c 'echo' "$ RESULT" '>> "./'$TEMP_DIR'/'$OUT_FILE'" '
Questo ovviamente generalizza a cose diverse dalla scrittura nei file di output:
setlock mylockfile sh -c '... interbloccato; cose …'
`pwd`
; puoi semplicemente usare un punto (.
). Inoltre dovresti citare l'intero nome del file poiché include variabili .