Страница 1 из 1

Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-01 16:57:28
F1restorm
Если выполнить такой скрипт:

Код: Выделить всё

#!/bin/sh
echo one > a
echo two >> a
cat a | sed '/one/d' > a
то с вероятностью ~50%, содержимое файла будет пустым, а не строкой "two", как ожидается.

Если выполнить другой скрипт:

Код: Выделить всё

#!/bin/sh
echo one > a
echo two >> a
cat a | sed '/one/d' > a.bak && mv a.bak a
то с вероятностью 100%, содержимое файла будет строкой "two".

Объясните, аномалию, пожалуйста.

P.S.: Могу решить задачу следующим скриптом, но хочется понять описанное выше поведение:

Код: Выделить всё

#!/bin/sh
echo one > a
echo two >> a
sed -e '/one/d' -i .bak

Re: Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-01 17:04:15
paradox
cat a | sed '/one/d' > a
это можно одной командой делать
тогда все гут
и помоему как раз сразу седом
точно не помню

Re: Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-01 17:10:19
F1restorm
paradox писал(а): это можно одной командой делать
Дочитайте мое сообщение до конца, пожалуйста:
F1restorm писал(а): P.S.: Могу решить задачу следующим скриптом, но хочется понять описанное выше поведение:

Код: Выделить всё

...
sed -e '/one/d' -i .bak

Re: Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-01 17:45:33
paradox
нужно было сделать ударение)) я не туда посмотрел

ну возможно изза многопроцессорхных архитектур
или глюк появляеться и на однопроцессорных машинах?

Re: Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-01 17:59:33
F1restorm
paradox писал(а): ...
ну возможно изза многопроцессорхных архитектур
или глюк появляеться и на однопроцессорных машинах?
Машина однопроцессорная (AMD Athlon XP 1500+).

Re: Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-01 18:07:30
paradox
cat a | sed '/one/d' > a
тогда есть вариант
когда возможно для вывода используеться метод map памяти
а не вывода в поток
и при круговом обороте буфер треться сразу
как вариант
попробовать вместо cat какой то другой вывод...
может more если он не так же реализован как cat
либо написать свой аналог cat
который будет сначала в буффе считывать весь поток а потом выводить с буффера -так сказать для теста
если будет все гут
значит идея я думаю ясна

как вариант еще поискать thread safe утилиты cat,more итд

Re: Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-01 21:28:58
F1restorm
paradox писал(а):
cat a | sed '/one/d' > a
тогда есть вариант
когда возможно для вывода используеться метод map памяти
а не вывода в поток
и при круговом обороте буфер треться сразу
как вариант
попробовать вместо cat какой то другой вывод...
может more если он не так же реализован как cat
либо написать свой аналог cat
который будет сначала в буффе считывать весь поток а потом выводить с буффера -так сказать для теста
если будет все гут
значит идея я думаю ясна

как вариант еще поискать thread safe утилиты cat,more итд
Хочется не решение найти, т.к. оно уже есть, а понять, это ошибка или особенность. Если это особенность, то почему так реализовано.

За размышления - спасибо, может быть когда-нибудь пригодятся.

Re: Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-01 21:30:50
paradox
За размышления - спасибо, может быть когда-нибудь пригодятся.
проверь их
и сразу станет ясно

Re: Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-01 22:51:45
F1restorm
paradox писал(а):
За размышления - спасибо, может быть когда-нибудь пригодятся.
проверь их
и сразу станет ясно
Предположение я понял. Скорей всего так и есть.

Если попробовать проанализировать ситуацию, то получается, что описанное в первом сообщении поведение нормально. Объяснить это можно тем, что исходный файл может быть достаточно большим и поместить его полностью в буфер, может быть невозможно. К тому же одновременное чтение и запись в один и тот же файл разными программами ни к чему хорошему, без дополнительной синхронизации, не приведет. Пытаться это исправить, похоже, идеологически бессмысленно.

Для себя я понял, что использование в качестве входного и выходного потока одного и того же файла, в общем случае - опасно.

Re: Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-02 7:13:27
zg
F1restorm писал(а):Для себя я понял, что использование в качестве входного и выходного потока одного и того же файла, в общем случае - опасно.
не опасней, чем есть из кастрюли старый суп и тут же варить в ней новый.

Re: Исчезает содержимое файла, если он источник и приемник

Добавлено: 2009-05-02 9:16:05
F1restorm
zg писал(а): не опасней, чем есть из кастрюли старый суп и тут же варить в ней новый.
:ROFL: :good: