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

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
F1restorm
рядовой
Сообщения: 16
Зарегистрирован: 2009-04-27 7:22:36
Откуда: Москва
Контактная информация:

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

Непрочитанное сообщение F1restorm » 2009-05-01 16:57:28

Если выполнить такой скрипт:

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

#!/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
Все гениальное - просто!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

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

Непрочитанное сообщение paradox » 2009-05-01 17:04:15

cat a | sed '/one/d' > a
это можно одной командой делать
тогда все гут
и помоему как раз сразу седом
точно не помню

Аватара пользователя
F1restorm
рядовой
Сообщения: 16
Зарегистрирован: 2009-04-27 7:22:36
Откуда: Москва
Контактная информация:

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

Непрочитанное сообщение F1restorm » 2009-05-01 17:10:19

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

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

...
sed -e '/one/d' -i .bak
Все гениальное - просто!

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

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

Непрочитанное сообщение paradox » 2009-05-01 17:45:33

нужно было сделать ударение)) я не туда посмотрел

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

Аватара пользователя
F1restorm
рядовой
Сообщения: 16
Зарегистрирован: 2009-04-27 7:22:36
Откуда: Москва
Контактная информация:

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

Непрочитанное сообщение F1restorm » 2009-05-01 17:59:33

paradox писал(а): ...
ну возможно изза многопроцессорхных архитектур
или глюк появляеться и на однопроцессорных машинах?
Машина однопроцессорная (AMD Athlon XP 1500+).
Все гениальное - просто!

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

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

Непрочитанное сообщение paradox » 2009-05-01 18:07:30

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

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

Аватара пользователя
F1restorm
рядовой
Сообщения: 16
Зарегистрирован: 2009-04-27 7:22:36
Откуда: Москва
Контактная информация:

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

Непрочитанное сообщение F1restorm » 2009-05-01 21:28:58

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

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

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

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

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

Непрочитанное сообщение paradox » 2009-05-01 21:30:50

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

Аватара пользователя
F1restorm
рядовой
Сообщения: 16
Зарегистрирован: 2009-04-27 7:22:36
Откуда: Москва
Контактная информация:

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

Непрочитанное сообщение F1restorm » 2009-05-01 22:51:45

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

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

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-05-02 7:13:27

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

Аватара пользователя
F1restorm
рядовой
Сообщения: 16
Зарегистрирован: 2009-04-27 7:22:36
Откуда: Москва
Контактная информация:

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

Непрочитанное сообщение F1restorm » 2009-05-02 9:16:05

zg писал(а): не опасней, чем есть из кастрюли старый суп и тут же варить в ней новый.
:ROFL: :good:
Все гениальное - просто!