случайное поведение при отправке вывода результатов поиска в xargs, а затем в sed - PullRequest
0 голосов
/ 14 июля 2020

я использую версию этих инструментов gnu

Я пытаюсь распаковать архив и преобразовать файл

Файл называется «myfile.txt», и он появляется в нескольких папках в архиве - поэтому я подумал, что передача полного пути к xarg преобразует все файлы

mkdir temp
unzip mypackage.zip -d temp

find temp -iname "myfile.txt" | xargs -I FILE sh -c "sed -e 's/replacethis/withthis/g' -e 's/replacethistoo/withthisaswell/g' FILE | tee FILE"
# List the files
find temp -iname "myfile.txt" | xargs -I FILE ls -l FILE
# Cat the files
find temp -iname "myfile.txt" | xargs -I FILE cat FILE
# Clean up 
rm -Rf temp

Я запускаю этот скрипт несколько раз и получаю разные результаты, которые я не понимаю

Каждый раз другой файл «myfile. txt "изменен, иногда один из файлов" myfile.txt "имеет 0 байт

Почему это происходит? Это должно быть каждый раз одно и то же, не так ли? При каждом запуске этого скрипта find передает только один случайный путь "myfile.txt" к xargs?

1 Ответ

3 голосов
/ 14 июля 2020

Почему это происходит? Он должен быть одинаковым каждый раз, не так ли?

Это происходит из-за состояния гонки между двумя параллельными операциями:

  • sed открытие и чтение файла
  • tee открытие и усечение файла

Если tee выиграет, файл будет пустым, когда sed прочитает его, и поэтому он будет иметь размер 0 байт.

Если sed выиграет, он прочитает (по крайней мере, часть) файла, и вы получите некоторые данные.

Поскольку планирование процесса непредсказуемо, вы рискуете увидеть разные результаты для каждого время.

...