flock
là một trong những cách của hoạt động lồng vào nhau. Tiện ích này là một phần của bộ công cụ linux-linux và chỉ có sẵn cho Linux. Các tiện ích khác, có sẵn trên một loạt các nền tảng, dựa trên setlock
tiện ích của Daniel J. Bernstein từ gói daemontools của anh ấy:
Các công cụ này hoạt động với một mô hình hơi khác với mô hình được sử dụng trong câu trả lời của M. Kurenkov (một công cụ flock
cũng có thể sử dụng, nhưng không có trong câu trả lời đó). Người ta gọi setlock
chương trình để tải chuỗi cho lệnh phải được lồng vào nhau. setlock
chính nó mở và khóa tệp khóa và để lại một bộ mô tả tệp cho nó mở trong quy trình của nó. Khóa vẫn tồn tại miễn là quá trình đó thực hiện (trừ khi lệnh tiếp theo được xâu chuỗi để giải phóng khóa một cách rõ ràng bằng cách tìm và đóng bộ mô tả tệp đang mở).
Đối với trường hợp trong câu hỏi, người ta phải lồng vào lệnh tạo ra dòng đầu ra, lưu ý rằng điều này gọi một bên ngoài echo
thay cho echo
lệnh tích hợp shell :
setlock mylockfile echo "$ RESULT" >> ./$TEMP_DIR/$OUT_FILE
Trong trường hợp này, không cần thiết phải khóa liên động mở tệp đầu ra ở chế độ chắp thêm. Nếu đúng như vậy, người ta sẽ phải mở tệp đó trong khóa, điều này bắt buộc phải sử dụng các chương trình như fdredir
/ redirfd
:
setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$ RESULT"
cái nào có thể biến thành hàm shell nếu muốn:
outfile () {setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "$ @"; }
[
Vách ] outfile echo "$ RESULT"
hoặc bám theo cú pháp shell và để nó được giải thích bởi shell thứ hai chạy dưới khóa liên động, yêu cầu một số trích dẫn không tầm thường nếu các biến shell của một người không được xuất dưới dạng biến môi trường:
setlock mylockfile sh -c 'echo' "$ RESULT" '>> "./'$TEMP_DIR'/'$OUT_FILE'" '
Điều này tất nhiên khái quát cho những thứ khác ngoài việc ghi vào các tệp đầu ra:
setlock mylockfile sh -c 'lồng vào nhau; đồ đạc …'
`pwd`
; bạn chỉ có thể sử dụng một dấu chấm (.
). Ngoài ra, bạn nên trích dẫn toàn bộ tên tập tin vì nó bao gồm các biến .