LINUX.ORG.RU

pipe и непонятки..


0

1

всем привет.

есть такой код: cat $some_file | grep -v $some_pattern > $some_file

проблема в том, что иногда(адекватно объяснить причину не могу) содержимое $some_file пропадает полностью, чего быть не может в принципе.

вот я и подумал, что возможно, чтение и запись $some_file происходит одновременно, из-за чего cat глюкает и выдает grep`у пустой файл.

ну или еще какое-нить чудо =)

вопрос в том, корректен ли приведенный выше фрагмент кода?

благодарен.

★★★

Естественно одновременно. Все команды в конвейере запускаются одновременно, соответственно и подготовка файлов/перенаправлений. Не совсем одновременно, конечно, но однозначно предсказать результат такой команды нельзя.

Так что man {awk|grep}

om-nom-nimouse ★★
()
Ответ на: комментарий от om-nom-nimouse

значит я все-таки правильно понял причину «бага».

спасибо. вопрос закрыт.

niXman ★★★
() автор топика

niXman

вопрос в том, корректен ли приведенный выше фрагмент кода?

нет. Потому-что конструкция > some_file прежде всего очищает файл и усекает его до нулевой длинны. «не всегда» это случается потому, что файл читается порциями, например по 64К, и в принципе вы можете успеть прочитать порцию до выполнения >some_file. Pipe тут играет роль временного файла. Точнее - иногда у неё это получается.

ЗЫЖ и да, ваше так любимое новичками cat file | grep 'pattern' вас же самих и путает - вы одной-то команды осилить не можете, но бьёте команду на части. Это кстати ещё и медленно.

niXman

вот я и подумал, что возможно, чтение и запись $some_file происходит одновременно

в сильно упрощённом варианте так оно и есть.

ЗЗЫЖ а вы не задумывались, зачем надо sed -i и прочие аналогичные опции?

drBatty ★★
()
Ответ на: комментарий от drBatty

а вы не задумывались, зачем надо sed -i и прочие аналогичные опции?

таки да, именно для этого.

спасибо.

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

niXman

таки да, именно для этого.

советую узнать, как они работают. (уже писал, повторяться лениво).

drBatty ★★
()

man sponge, напрмер

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.