@здесь и @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.”