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 setlocksull'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 flockpuò anche impiegare, ma non in quella risposta). Uno invoca il setlockprogramma per caricare a catena il comando che deve essere interbloccato. setlocksi 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 echocomando 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 .