flock
є одним із способів операцій блокування. Утиліта є частиною набору інструментів util-linux і доступна лише для Linux. Інші утиліти, доступні на більш широкому спектрі платформ, базуються на setlock
утиліті Даніеля Бернштейна з його пакету daemontools:
Ці інструменти оперують дещо іншою парадигмою до тієї, що використовується у відповіді М. Куренкова (та, яка flock
також може використовувати, але не відповідає у цій відповіді). Один викликає setlock
програму для ланцюгового завантаження команди, яка повинна бути замкненою. setlock
сам відкриває і блокує файл блокування, і залишає дескриптор файлу для нього відкритим у процесі. Блокування зберігається до тих пір, поки це робить процес (якщо тільки наступна команда, прикавана до явного звільнення блокування, шляхом пошуку та закриття дескриптора відкритого файлу).
Для випадку у запитанні слід замикати команду, яка створює вихідний рядок, маючи на увазі, що це викликає зовнішню echo
замість вбудованої echo
команди оболонки :
setlock mylockfile echo "$ RESULT" >> ./$TEMP_DIR/$OUT_FILE
У цьому випадку не потрібно блокувати відкриття вихідного файлу в режимі додавання. Якби це було, можна було б відкрити цей файл в замку, що вимагає або з допомогою програм , як fdredir
/ redirfd
:
setlock mylockfile fdredir --додайте 1 "./$TEMP_DIR/$OUT_FILE" echo "$ RESULT"
яку можна перетворити на функцію оболонки, якщо хочеться:
outfile () {setlock mylockfile fdredir --додайте 1 "./$TEMP_DIR/$OUT_FILE" "$ @"; }
[…]
Відлуння відлуння "$ РЕЗУЛЬТАТ"
або дотримуватися синтаксису оболонки і інтерпретувати його за допомогою другої оболонки, що працює під блоком, що вимагає деякого нетривіального цитування, якщо змінні оболонки не експортуються як змінні середовища:
setlock mylockfile sh -c 'echo' "$ RESULT" '>> "./'$TEMP_DIR'/'$OUT_FILE'" '
Це, звичайно, узагальнює інші речі, крім запису у вихідні файли:
setlock mylockfile sh -c '… замкнений; речі ... '
`pwd`
; ви можете просто використовувати крапку (.
). Також слід навести ціле ім'я файлу, оскільки воно містить змінні .