Sử dụng thay thế tiến trình bash, tôi muốn chạy đồng thời hai lệnh khác nhau trên một tệp. Trong ví dụ này không cần thiết nhưng hãy tưởng tượng rằng "cat/usr/share/dict/words" là một hoạt động rất tốn kém chẳng hạn như giải nén tệp 50gb.Kết quả không chính xác với sự thay thế và đuôi của quá trình bash?
cat /usr/share/dict/words | tee >(head -1 > h.txt) >(tail -1 > t.txt) > /dev/null
Sau lệnh này, tôi muốn h.txt chứa dòng đầu tiên của tệp từ "A" và t.txt chứa dòng cuối cùng của tệp "Zyzzogeton".
Tuy nhiên điều thực sự xảy ra là h.txt chứa "A" nhưng t.txt chứa "argillaceo", khoảng 5% vào tệp.
Tại sao điều này lại xảy ra? Có vẻ như quá trình "đuôi" đang kết thúc sớm hoặc các luồng đang bị lẫn lộn.
Chạy một lệnh tương tự như thế này cư xử như mong đợi:
cat /usr/share/dict/words | tee >(grep ^a > a.txt) >(grep ^z > z.txt) > /dev/null
Sau lệnh này tôi mong đợi a.txt để chứa tất cả các từ bắt đầu bằng "a", trong khi z.txt chứa tất cả các các từ bắt đầu bằng "z", chính xác là những gì đã xảy ra.
Vậy tại sao tính năng này không hoạt động với "đuôi" và các lệnh khác sẽ không hoạt động như thế nào?
Tôi nghĩ rằng đây có liên quan đến http://stackoverflow.com/questions/4489139/bash-process-replace-and-syncing cho thấy rằng các tiến trình có trong lối ra thay thế ngay sau khi lệnh bên ngoài kết thúc, nhưng thẳng thắn tôi không thể chứng minh đó là vấn đề hiện tại với bất kỳ lệnh nào tôi đã cố gắng cho đến nay –