k001
k001
:...

April 2032
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

k001 [userpic]
программазмы / dos2unix

Говно, а не программа! © ОСП студия.


В общем, в операционных системах UNIX, DOS/Windows и MAC конец строки в текстовом файле обозначается по-разному (есть тому исторические причины, не буду вдаваться). Поэтому люди написали специальную программулину, которая преобразует текстовые файлы из одного формата в другой. Называется - dos2unix.

Собственно, эта прога должна делать очень простую вещь - по всему файлу два подряд идущих символа c кодами 10, 13 заменять на один символ с кодом 10. И она-таки с этим не справляется!

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

В общем, оно вываливается с невразумительной ошибкой.

Так не пишите программы никто.

Comments

не надо в меня RTFMами тыкать :)

tr -d '\r'

я всегда так и делаю. просто это был чужой спек-файл, я пытался его использовать. переписал как раз на tr.

Ндаа.. Ну что я могу тебе сказать??

"Используйте правильные дистрибутивы" :) Хотя я повторяюсь...

Думаешь, в правильных дистрибутивах при сборке нигде не может (в принципе) использоваться dos2unix или подобный ему PoS?


bacek@bacek:~/src$ apt-get source sim
Reading Package Lists... Done
Building Dependency Tree... Done
Need to get 1712kB of source archives.
Get:1 http://ftp.fi.debian.org unstable/main sim 0.8.3-2 (dsc) [747B]
Get:2 http://ftp.fi.debian.org unstable/main sim 0.8.3-2 (tar) [1627kB]
Get:3 http://ftp.fi.debian.org unstable/main sim 0.8.3-2 (diff) [84,6kB]
Fetched 1712kB in 1s (1596kB/s)
dpkg-source: extracting sim in sim-0.8.3
bacek@bacek:~/src$ cd sim-0.8.3/
bacek@bacek:~/src/sim-0.8.3$ grep -r dos2unix *
bacek@bacek:~/src/sim-0.8.3$


За весь дистрибутив конечно не скажу, но...

в 0.8.3 у меня этого тоже не было. это в 0.9pre (в asplinux-contribs (или -devel? не важно)), да и то я уже намекнул ментейнеру, и он это поправит.

Вы с [info]bacek@lj сговорились?

Я не спрашивал, какую можно придумать замену. Я, собственно, писал о том, что оно говно и что "так не делайте никто".

А зачем он его во временную директорию пишет? Вопрос, в общем-то, риторический ;)

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

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

1. Во временный файл он его пишет правильно. Но вот почему в текущий каталог, а не, к примеру, в тот - не знаю. К тому же, я подозреваю, если переименование файла удастся, то запорются permissions на оригинальный файл (чего можно избежать, если открыть оригинальный файл и вписать туда содержимое временного).

2. Такую гнусную программу (у неё, кстати, версия аж 3.1!) даже и править не хочется. Какие-то студенты первого курса писали (вероятно, те из них, которые не умели написать простую строчку на tr/sed/perl/etc.).