@здесь и @far 120

Этот пост только для программистов. Извини. Если вы не один из них, просто переходите к слабой шутке дня, потому что я даже не буду пытаться объяснять это непрограммистам. Не потому, что я не люблю тебя, я люблю. Но извините, нет.

Ты все еще здесь?

Большой.

Знаете ли вы, что это состояние гонки?

$ printf “new line\n$(cat myfile.txt)” | tee myfile.txt

Это. Я тоже не поверил.

Но, во-первых, для чего эта строка?

Он используется для *дополнения* текста к файлу. *Добавление* текста к файлу в bash очень просто, а добавление в начале — нет.

О состоянии гонки? Позвольте мне сломать его.

Оператор $(cat myfile.txt) запускает новый подпроцесс, который возвращает текст из файла myfile.txt с помощью команды cat. Затем это передается команде printf, байт за байтом (или, возможно, строка за строкой). Оператор printf немедленно передает этот текст в | (оператор канала), который передает текст команде tee. Затем команда tee записывает его в myfile.txt.

Вот проблема: если tee запишет текст в myfile.txt до того, как cat прочитает текст в myfile.txt, cat прочитает мусор. Вы никогда не захотите читать свой ввод после записи в тот же файл, так как ваши результаты будут повреждены.

На самом деле существует только один способ возникновения состояния гонки. Это когда printf отправляет текст new line |, а tee пишет его myfile.txt прежде cat начинает читать. В любой другой ситуации | и tee потребовали бы записи того, что еще не было прочитано из файла, что, очевидно, не может произойти.

Я понятия не имел, что это может произойти, но это случилось со мной.

Остерегаться!

-

«Папа, мой компьютер сломался».

«Вы пробовали перезагрузить его?»

“No.”