Сейчас 2018 год, а это сообщение — ошибка, сохранившаяся с 1974 года. Ограничение, которое встречается даже в самой последней Windows 10, появилось ещё ДО «ЗВЁЗДНЫХ ВОЙН». Баг древний как Уотергейт.


В те времена только изобрели штрих-коды, в Америке работала лишь одна телефонная компания, Тед Банди ещё бегал на свободе, а рекорд Бейба Рута по хоум-ранам стоял последние дни.

Когда появился этот баг, по телевизору ещё не показывали «Колесо Фортуны» (российский аналог: «Поле чудес», 1990 год — прим. пер.). Никто не видел «Шоу ужасов Рокки Хоррора», а Стивен Спилберг снял несколько телефильмов и один полноэкранный фильм, провалившийся в кинопрокате (но картина «Дуэль» получила несколько кинопремий — прим. пер.). По NBC не показывали «Субботним вечером в прямом эфире», а «Эдмунд Фицджеральд» ещё перевозил железную руду (гигантский сухогруз с экипажем затонул 9 ноября 1975 года — прим. пер.).

КОГДА ИЗОБРЕЛИ ЭТУ ГЛУПУЮ «ФИЧУ», НА ЭКРАНЫ ТОЛЬКО ВЫШЛА ВТОРАЯ ЧАСТЬ «КРЁСТНОГО ОТЦА».

Так почему это произошло? В то время уже пять лет как вышел Unix с хорошей идеей «всё является файлом», что открывало дверь для множества возможностей: запись в сокеты, конвейер, консоль и прочее с теми же командами и инструкциями.

Идею реализовал Гэри Килдалл в CP/M в 1974 году. Она позволяет классные вещи, такие как копирование данных с последовательного порта в текстовый файл или печать текстового файла прямо из командной строки!

В Unix это делается через специальные файлы, существующие в специальных папках, как /dev/tty для консоли или /dev/lp0 для первого принтера. Вы можете получить бесконечный поток нулей из /dev/zero, случайные байты из /dev/random и т.д.!

Но вот проблема: CP/M предназначена для 8-битных компьютеров с небольшим объёмом памяти и без жёстких дисков. В лучшем случае у вас есть 8-дюймовый дисковод для гибких дисков. Какие директории? Они вам не понадобятся. Просто используете разные диски.

Но без директорий вы не можете поместить свои файлы в каталог /dev/. То есть они просто повсюду. Так что если вам нужно распечатать файл foo.txt, вводим команду PIP LST:=FOO.TXT, что копирует foo.txt в «файл» LST, который является принтером. И это работает везде, потому что нет никаких директорий! Всё просто.

Но как насчёт расширений? Тут проблема: программы любят добавлять к файлам свои расширения. Поэтому если программа говорит «Введите имя файла, чтобы сохранить листинг», есть возможность указать LST для распечатки или PTP для выбивания на перфоленте (потому что это 1974 год, помните?). Но программа может попытаться поставить .TXT в конце имени файла! LST.TXT — это же не принтер, верно?

Неа. Хак всё равно работает. Специальные устройства транслируются на все расширения, так что CON зарезервировано для клавиатуры даже в случае CON.TXT или CON.WAT, или CON.BUG.

Да уж. Это реальный хак, но он нужен только некоторым маленьким микрокомпьютерам с 4 КБ оперативной памяти, кого это волнует?

Операционка CP/M получила широкое распространение в конце 70-х и начале 80-х. Это была одна из основных ОС для бизнеса. Она определила стандартный интерфейс, так что вы могли написать код CP/M на NorthStar Horizon — и запустить его на Seequa Chameleon.

Отсутствие универсального графического стандарта не позволяло писать для него много игр (хотя есть релизы Infocom), так что стандарт использовался в основном в деловой среде.

Но рынок был большой: естественно, IBM хотела его охватить для нового проекта под названием «PC», который они делали в начале 1980 года.

IBM намеревалась выпустить IBM PC с несколькими операционными системами и ожидала, что CP/M станет «основной». Но CP/M для x86 появилась только через 6 месяцев после запуска IBM PC… и стоила $240 против $40 для DOS.

Таким образом, подавляющее большинство пользователей в конечном итоге купили Microsoft PC-DOS — новую версию операционной системы, изначально разработанную компанией Seattle Computer Products. MS купила проект Тима Патерсона и развила его в PC-DOS (который позже переименуют в MS-DOS, если вы не в курсе).

Система Тима Патерсона называлась QDOS (Quick and Dirty Operating System, «быстрая и грязная операционная система»). Её написали по-быстрому, потому что CP/M ещё не вышла под x86, и QDOS пыталась преодолеть некоторые ограничения CP/M. Эта система определённо во многих отношениях копировала CP/M.

Среди прочих была позаимствована концепция специальных файлов и отсутствие каталогов, потому что это была полезная функция CP/M. Таким образом, в QDOS и PC-DOS 1.0 тоже есть AUX, PRN, CON, LPT и т.д.!

Для PC-DOS 2.0, выпущенной в 1983 году для нового IBM XT, компания Microsoft значительно обновила PC-DOS. В IBM XT имелся жёсткий диск, поэтому в PC-DOS добавили поддержку каталогов. Нужно ведь навести порядок в куче файлов на огромном жёстком диске 10 МБ, очевидно!

Но вот проблема: пользователи уже используют эти специальные файлы с момента выпуска PC DOS 1.0 двумя годами ранее. Написано программное обеспечение с их поддержкой! В продакшн ушли пакетные файлы.

С появлением директорий Microsoft теперь могла сделать папку C:\DEV… но не сделала.

Не в последний раз Microsoft пожертвовала здравым смыслом ради обратной совместимости. Специальные файлы теперь могут быть в ЛЮБОМ КАТАЛОГЕ и С ЛЮБЫМ РАСШИРЕНИЕМ. Так что ваша команда DIR > LPT для печати листинга файлов продолжит работать в C:\DOS, как она работала в A:\.

Конечно, мы не запускаем DOS 2.0… Но Windows 95 построили поверх DOS. Естественно, она унаследовала это поведение (как и Windows 1/2/3 ранее). Windows 95 больше нет! Текущая ветвь Windows основана на Windows NT, а не Win95.

Однако Windows NT стремилась сохранить совместимость с программами DOS/Windows, поэтому XP объединила две ветви. Так что эти специальные файлы всё ещё работают, СПУСТЯ СОРОК ЧЕТЫРЕ ГРЁБАНЫХ ГОДА.

Можете сами попробовать! Откройте Проводник, создайте новый текстовый файл и назовите его con.txt, aux.txt или prn.txt.

Вам скажут ИЗВИНИ, ДРУГ…



Гэри Килдалл позаимствовал отличную идею из Unix и приспособил её для микрокомпьютеров с 4 КБ памяти без каталогов — это случилось так давно, что у родившихся тогда детей уже могут быть свои дети, которые имеют право покупать алкоголь, но мы по-прежнему не имеем права назвать файл con.txt.

Microsoft приводит полный список запрещённых названий: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9.

Для ещё большего кайфа, попытка доступа к C:\con\con (или C:\aux\aux) на win95 мгновенно покажет синий экран. Это было весело даже в 1995 году, потому что багу исполнился 21 год! Представьте, что какая-то ошибка сохраняется настолько долго?





Бонус: вот фотография Тима Патерсона на VCF:W в августе этого года, он рассказывает об истории DOS.



Если вам интересно, как у меня появился «запрещённый» файл, который нельзя скопировать, то скажу. Эти имена специальных устройств реализуются на уровне ОС, а не на уровне файловой системы. Таким образом, это совершенно допустимые имена файлов NTFS, а я использовал диск NTFS под Linux.

Похоже, что OS/2 тоже не реализовала эти специальные имена, потому что на одном из дисков от IBM есть файлы AUX.H в комплекте OpenGL.



Так что сегодня я попытался сделать резервную копию этого диска NTFS на основной ПК и ОП-ПА, НЕВОЗМОЖНО СКОПИРОВАТЬ ВСЕ ФАЙЛЫ ИЗ-ЗА БАГА СТАРШЕ, ЧЕМ БОЛЬШИНСТВО ЧИТАТЕЛЕЙ ЭТОЙ СТАТЬИ.

Несколько примечаний:

1. CP/M на самом деле не использовала эти специальные имена так просто, как я описал. Похоже, что я или не знал, или забыл об этом факте. На самом деле они должны сопровождаться двоеточием, как имена дисков, то есть PRN: — это принтер, PRN — нет.

2. CP/M не реализовала их на уровне ОС, как в DOS! Они были просто включены в PIP, команду копирования файлов. Поэтому там не работал трюк DOS сохранения в файл PRN.TXT с автоматической печатью. Я не имел в виду, что CP/M так делала, а только DOS, но видимо не ясно выразился.

3. В PC DOS 1.0 на самом деле не было редиректов или конвейера, так что вы не сможете сделать такой редирект, как я предложил. Забыл об этом. Их добавили в PC DOS 2.0 в 1983 году. Хотя PC DOS 1.0 поддерживала копирование в/из специальных файлов, поэтому общий тезис правильный, даже если пример неудачный.

В любом случае, спасибо за отклики на эту статью! Не ожидал, что она так взорвётся, я просто накропал пару абзацев, когда пришёл домой сильно уставший и увидел сообщение об ошибке из-за бага 44-летней давности.

И если что, я не собирался кричать «Windows SUCKS». Обратная совместимость, в общем, хорошая вещь. На самом деле, я хотел бы больше обратной совместимости, а не меньше.

Но меня просто поразил этот баг из древности, который выскочил во время копирования с USB 3.0 SSD на другой SSD в Windows 10.

Это как будто живёшь на космической станции — а тут появляется лошадь.
tl; dr:

Комментарии (133)


  1. vindy123
    04.11.2018 16:54
    +4

    Искренне интересно, неужели два человека независимо решили сделать перевод одной и той же статьи и выложить его на Хабр? Или это типа челлендж? Пора свою версию перевода пилить уже или нет?)
    habr.com/post/428706


    1. Michae1
      04.11.2018 17:51

      Да, забавно вышло :) Честно, не сговаривались.


    1. AngReload
      04.11.2018 17:53
      +2

      На хабре стало слишком много переводчиков, происходят колизии.


      https://habr.com/company/ruvds/blog/428570/
      https://habr.com/company/plarium/blog/428612/


      https://habr.com/company/ruvds/blog/428173/
      https://habr.com/company/skillbox/blog/428231/


      1. tangro
        05.11.2018 11:41
        +3

        Потому, что в движке Хабра нет поиска по урл источника перевода и защиты от дублей.


      1. Goodkat
        05.11.2018 12:14
        +1

        Писать в фирменный блог что-то надо — за него деньги уплочены.
        Писать некому и нечего.
        А давай брать популярные статьи и переводить!


        1. stalkermustang
          06.11.2018 22:56
          +1

          Автор перевода выбирает крайне интересные(по крайней мере для меня) статьи и достаточно здорово справляется со своей работой. Спасибо ему огромное!


    1. Squoworode
      04.11.2018 18:00

      Не одной и той же. Это переводы разных репостов.


      1. khim
        04.11.2018 20:00

        А про оригинал всё давно забыли…


        1. Squoworode
          04.11.2018 20:06

          Но ведь это не оригинал постов, переведённых сейчас. Просто там поднята та же тема…


    1. Arris
      04.11.2018 20:18
      +1

      И тот и другой перевод — хреновые.

      Просто подстрочник, без попытки перевести текст на русский.

      Да и в оригинале это не статья, а поток сознания из какого-то чата.

      Переводчиков мало, переведунов много.

      P.S.



      что я делаю не так?


      1. DistortNeo
        04.11.2018 21:42
        +3

        Попробуйте теперь эти файлы открыть через проводник.
        Far Manager их, кстати, открывает без проблем — видимо, использует UNC-имена для доступа к файлам.


        1. Arris
          05.11.2018 02:14
          +2

          Знаете, забавно: не открываются файлы .txt, (Не удается найти `\\. \con.txt`) но с просто aux, con — предлагает сопоставить расширение.

          Впрочем, заголовок все равно кликбейтный. А перевод хреновый.

          P.S. Опять могу отвечать раз в час. Нет, плохие переводчики все равно не заткнут мне рот. Я сделаю хабр лучше, пусть даже ценой своей «кармы»!


        1. Iwanowsky
          05.11.2018 17:53

          Я тоже поначалу пошел по не правильному пути, создавая файлы как раз в ФАР и хотел написать тут подобным образом, типа ЧЯДНТ. Однако потом, случайно попытавшись удалить файл в Проводнике, получил ошибку про несуществующий файл. Дальше стал экспериментировать в Проводнике и понял, что статья отражает правду жизни.


      1. CoolCmd
        04.11.2018 21:51

        .


      1. susnake
        05.11.2018 08:35

        Не знаю. У меня win10 попробовал создать файл con написали «Указано неверное имя устройство». И файл con.txt не дал сохранить написал, что это имя зарезервировано.


      1. JuniorIL
        05.11.2018 13:27
        +1

        Перевод ужасен, как минимум потому, что там пишется о каких-то культурных событиях вообще непонятных человеку который вырос в СНГ или Европе.


        1. Arris
          05.11.2018 15:41

          Да это то ладно. Было бы оно изложено нормальным человеческим языком (а в идеале — были бы проведены параллели с событиями в СССР/РФ)…

          Но — нет. Это ведь слишком сложно, правда? :(


        1. dimm_ddr
          05.11.2018 16:20

          Я не думаю что в переводе стоит заменять одни события на другие из другой части света. Это все же перевод, а не статья на ту же тему.


          1. Kutak
            06.11.2018 04:40

            В таких случаях используют сноски с разъяснениями. В скобках пишут (прим. перев.).
            Навроде как в переводах романов Стивена Кинга, где такое же огромное количество упоминаний неких событий/персоналий/мест, которые могут что-то сказать только местному. Типа «Райт Эйд», «Кул-Эйд», и т. д., и т. п.


        1. roscomtheend
          06.11.2018 15:35

          … и не интересовавшемуся ничем за его пределами. Хотя, отсылок как-то многовато, больше похоже на тоску по молодости, а не описанию бага (бага ли?)


      1. K0styan
        07.11.2018 13:42
        +1

        А в оригинале это и есть поток сознания. Тред в твиттере: twitter.com/Foone/status/1058676834940776450


  1. Captain_Sparrow
    04.11.2018 18:11

    Первые четыре абзаца — прям Намедни. Я, конечно, понимаю, что перевод и это разговор с копипастой в пустоту, но тяжело читать столько воды в одном месте.


    1. vsapronov
      04.11.2018 18:23

      Не понял, это вы сейчас Намедни назвали водой?


      1. Captain_Sparrow
        04.11.2018 18:30
        +1

        Нет, это я сейчас назвал водой первые четыре абзаца статьи. Довольно длинный беллетристический экскурс в общую историю в статье про компьютерный баг. Не в вину переводчика, конечно же.


  1. JC_IIB
    04.11.2018 18:21

    «Были программы, написанные пять тысяч лет назад, когда человечество еще не покинуло Землю. И самое чудесное (самое ужасное, как говорила Сура) было то, что, в отличие от бесполезных обломков прошлого Канберры, эти программы все еще работали! И через миллион миллионов запутанных нитей наследования многие из старейших программ все еще выполнялись во внутренностях системы Кенг Хо. Например, методы слежения за временем у торговцев. Поправки вносились неимоверно сложно – но на самом дне лежала крошечная программа, которая гоняла счетчик. Секунду за секундой отсчитывала система Кенг Хо с того момента, как нога человек ступила на Луну Старой Земли. Но если приглядеться еще пристальнее… начальный момент был миллионов на сотню секунд позже; момент «ноль» одной из первых компьютерных операционных систем Человечества.» (С)


    1. seri0shka
      04.11.2018 23:04
      +2

      Буквально 20 минут назад читал на Хабре эту же цитату в комментарии к другой статье. )


      1. burzooom
        05.11.2018 11:53
        +1

        В Матрице техработы, вот глюки чаще появляются


    1. easty
      05.11.2018 07:21

      Вернон Виндж, все у него перечитал. Эх…


  1. Bonio
    04.11.2018 18:24

    Для тех, кто хочет создать такой файл: type nul > "\\?\C:\con.txt"
    Раньше я таким образом создавал на флешках системную папку autorun.inf с файлом con внутри, такая себе защита от автозапускающихся вирусов.


    1. mayorovp
      04.11.2018 21:32
      +1

      Системной папку autorun.inf лучше как раз не делать: на это агрятся некоторые антивирусы.


      1. slonopotamus
        04.11.2018 21:41
        +3

        Может быть лучше не пользоваться этими самыми некоторыми антивирусами?


        1. mayorovp
          05.11.2018 10:52
          +1

          Так весь смысл защиты флешки — когда ее приходится вставлять в чужие компьютеры. А там может стоять любой антивирус.


          1. konstwww
            05.11.2018 14:17

            Как по мне, смысл защиты флешки не подхватить вирус на нее с чужого компьютера, или не дать ему запуститься на моем. И системная папка autorun.inf может помочь. Я правда в системе просто автозапуск для всех дисков отключаю.


            1. ICELedyanoj
              05.11.2018 14:31

              Мне как-то раз принесли на флешке фотографии для распечатки.
              А у меня с давних времён параноидальная привычка отключать опцию «скрывать расширения для зарегистрированных типов файлов». Человек говорит фотки в папке «Foto», а я смотрю, что у этой папки (несмотря на правильную иконку) расширение «exe». Включил детальный режим просмотра папки, и таки да — это файл, а не папка. Троян подменил папку на своё тело.


              1. Alexufo
                05.11.2018 14:43

                оригинальная папка Foto скорее всего сушествует просто помечена трояном как скрытая.


                1. ICELedyanoj
                  05.11.2018 14:49

                  Опцию «показывать скрытые» и «показывать системные» я тоже всегда первым делом включаю.


              1. AquiHostStrider
                06.11.2018 09:59
                +2

                А у меня с давних времён параноидальная привычка отключать опцию «скрывать расширения для зарегистрированных типов файлов».
                Это абсолютно нормальная привычка выключать то, что придумали дебилы. Это настоятельно рекомендуется делать сразу же после установки Windows, у меня на этот случай даже *.reg-файл есть для импорта, созданный ещё со времён Win2k.
                Целевая ветвь реестра:
                HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\HideFileExt
                Параметры: CheckedValue, DefaultValue, UncheckedValue.


              1. vesper-bot
                06.11.2018 10:41

                у меня с давних времён параноидальная привычка отключать опцию «скрывать расширения для зарегистрированных типов файлов»

                Вообще, очень правильная привычка, причем эта настройка нужна хотя бы для того, чтобы мочь поменять расширение txt на log в проводнике, не занимаясь камасутрой. Побочный результат — детектирование таких вот умных вирей.


                PS: и почему на серверах эта настройка по умолчанию не включена? Их же под админов делают, а не под пользователей, кому типа не нужно думать о расширениях (с) ?


            1. ICELedyanoj
              05.11.2018 14:48
              +1

              А с самым смешным вирусом я столкнулся во времена Active Desktop на Win98SE.
              Майкрософтовцы экспериментировали с активным содержимым — в любой папке можно было создать файлик folder.htt, содержащий код веб-страницы, и она использовалась проводником. Я тогда ещё игрался, устанавливая страничку с видео-файлом, проигрывающимся прямо на рабочем столе.
              Так вот однажды притащили мне комп с жалобами «тормозит неимоверно, наверное вирус». Включил — действительно тормоза. Дай, думаю, сниму оттуда жёсткий диск и прогоню на нём проверку из-под моей системы.
              Так вот идея вируса оказалась гениальной. Вирус создаёт файлик «folder.htt», который содержит внутри себя тело вируса и код, который выгружает это тело в системную папку и запускает на выполнение. Вирус, запустившись, начинает сканировать всю структуру диска, и создавать «folder.htt» в каждой папке, до которой дотянется. Для заражения достаточно просто зайти в папку — запускать ничего не требуется, всю остальную работу за вирус делал сам майкрософт.
              Повезло, что вирус был написан явно для прикола и без особых изысков — он сам демаскировал себя тем, что клал на лопатки заражённую систему, не заботясь о скрытности, паузах, использовании iddle и т.д. Ну и единственной его задачей оказалось самораспространение — никаких других вредоносных функций у него не было.
              Ох и долго я с ним боролся — тогдашние антивирусы с ним справлялись очень плохо. Вирус запускал несколько своих копий, которые постоянно следили за тем, чтобы юзер не мог закрыть сразу все процессы вируса и постоянно запускал новые процессы вместо остановленных. Прописал себя сразу во все возможные места автозагрузки, и если пропустил хотя бы одно возможное место — при перезапуске сразу же прописывался заново в остальных местах.
              Был тогда совсем ещё зелёный, интернета можно сказать не было, антивирус не справился, поэтому пришлось до всего доходить самостоятельно.
              Потратил сутки на вычистку всех folder.htt со своего компа, только успокоился, как захожу в одну из папок, а там folder.htt — начинай всё сначала. Очень цепкая оказалась сволочь.

              А вот оно, с подробным описанием.


            1. mayorovp
              05.11.2018 17:01

              Как вам системная папка autorun.inf поможет, если ее удалит антивирус на этом самом чужом компьютере?


              1. MikailBag
                05.11.2018 19:20

                Так как он её удалит, если в ней есть NUL.txt?))


                1. sumanai
                  05.11.2018 19:49

                  Так же, как и создали. через UNC имена. Если бы антивирусы спотыкались на таких простых вещах, грош бы цена им была.
                  Впрочем, как по мне, лучшая защита своего компа от вирусов на любых флешках, а не только своих, — SRP.


                  1. Am0ralist
                    05.11.2018 22:02

                    Я делал проще:
                    Panda USB Vaccine создавала битый файл autorun.inf, на наличие которого агрились все антивирусы и ни один его не мог удалить. Только проверка диска на ошибки…
                    Таким образом я просто все флешки, до которых дотягивался, защищал и кучу раз наблюдал бедные вирусы на оных, который просто лежали и ничего не могли сделать)


                    1. sumanai
                      06.11.2018 02:01

                      Вот и у меня лежат, безо всяких сторонних программ.


              1. LoadRunner
                06.11.2018 11:48

                Права доступа только на чтение?


                1. mayorovp
                  06.11.2018 12:43

                  Если бы вы могли гарантировать, что эти самые права доступа будут соблюдаться — вам бы не требовалось исхитряться с папкой autorun.inf.


    1. DistortNeo
      04.11.2018 21:41
      +1

      Можно просто использовать Far Manager.


  1. mSnus
    04.11.2018 20:49
    +10

    Баг ещё в том, что система выдаёт "File too large" вместо того, чтобы понять, почему на самом деле файл не копируется. Вот это — и правда позорище.


    1. Mad__Max
      05.11.2018 03:41
      +1

      Оно еще и по разному на разных версиях себя ведет. Хотя казалось бы если это наследие времен ДОСа, то везде должно быть одинаково. Но нет, видимо это не раз переделывали, но оставляли на месте.

      Например win XP попытка создания(или копирования на диск файла созданного где-то еще) подобного файла без расширения в проводнике молча отменяется (ничего не происходит), а с расширением выдает ошибку «такой файл уже существует» (а не слишком большой файл как в 10ке).
      А при попытки сделать тоже самое через API из какой-то другой программы (не майрософта) обрабатывается корректно, выдает сообщение: «Это имя зарезервировано как имя устройства, выберете другое имя файла.»


  1. leR12
    04.11.2018 20:57

    пофиг на это.


  1. tormozedison
    04.11.2018 21:03
    +2

    "Это как будто живёшь на космической станции — а тут появляется лошадь".


    Надо же, как раз размышляю над рассказом о том, как и зачем на Марс когда-нибудь могут завезти лошадей. Но спойлерить не буду.


    1. Kwisatz
      05.11.2018 00:14
      +1

      А что с ней вообще не так?
      image


  1. alexstup
    04.11.2018 21:50
    -1

    image


    1. nuclight
      05.11.2018 02:48

      Это из Матрицы? Но вроде в оригинале не было столько проводов.


  1. Stepan555
    04.11.2018 22:50

    Запустил в Win10 и C:\aux\aux и C:\con\con. Ничего не случилось. Какой же это баг? Это фича.


    1. olegl84
      05.11.2018 16:09

      Это работало только в Wn95/98/Me. Причем через шару в том числе, можно было любой комп в сетку заблускринить.


  1. seri0shka
    04.11.2018 23:08
    +2

    вы указать LST для распечатки
    Вы чем переводить?


  1. mistergrim
    04.11.2018 23:22
    +3

    Мне одному кажется, что называть это «багом», особенно «БАГОМ», немного некорректно?
    Особенно с учётом того, что «Microsoft приводит полный список запрещённых названий» — то есть это вполне документированное поведение.
    Очередной хайп для тех, кто не застал книжки Питера Нортона, короче.


    1. mSnus
      05.11.2018 01:37
      +1

      Выдавать File too large и единственную опцию Skip — это точно баг


      1. mistergrim
        05.11.2018 03:50
        +2

        А это уже баг «проводника».


      1. Caseor
        05.11.2018 05:36

        единственную опцию Skip — это точно баг
        Вы пытаетесь работать проводником с файлом, который проводником создать нельзя и вообще он запрещён к созданию в этой ОС, так какую ещё опцию вы хотите? Радуйтесь, что не БСОД.


        1. mSnus
          05.11.2018 05:47

          Например, "Данное имя файла зарезервированнот системой и не может быть использовано. Переименовать?".


          БСОД при копировании это сильно. Надеюсь, этот подход похоронили где-то еще до OSR2..


          1. Caseor
            05.11.2018 06:03

            Данное имя файла зарезервированнот системой и не может быть использовано.
            Это разумно писать при попытке создания файла с таким именем. При копировании устройства как файла ошибка может выглядеть как угодно, ведь такого объекта и действия быть не может.


            1. sumanai
              05.11.2018 19:53

              ведь такого объекта и действия быть не может.

              Флешек и альтернативных ОС уже не существует?


          1. MrAloof
            05.11.2018 06:18

            Дык в том то и дело что он ничего не может сделать с этим файлом. И переименовать тоже не может. По этому только скип


            1. MikailBag
              05.11.2018 13:34

              Но Far Manager может.


        1. evil_random
          05.11.2018 14:14
          +1

          Радуйтесь, что не БСОД.

          Вы не в государственных структурах работаете случайно?


    1. Gummilion
      05.11.2018 10:40
      +1

      Получается ситуация «Это не баг, а фича», доведенная до абсурда — фича абсолютно не нужная, устаревшая больше 30 лет назад, но тем не менее заботливо поддерживаемая. И ведь наверняка есть тесты на то, чтобы нельзя было создать файл с именем «con»!


      1. mistergrim
        05.11.2018 13:55
        +2

        фича абсолютно не нужная, устаревшая больше 30 лет назад, но тем не менее заботливо поддерживаемая.
        Это называется «обратная совместимость». Чем Microsoft до сих пор и кроет остальные «альтернативные ОС», как бык овцу.
        И ведь наверняка есть тесты на то, чтобы нельзя было создать файл с именем «con»!
        Ну создайте. Стандартными средствами. А то получается, как в анекдоте с японской лесопилкой и суровыми сибирскими мужиками.


        1. Gummilion
          05.11.2018 14:31
          +1

          Ну 16-разрядные программы под 64-разрядными Windows все равно уже не запускаются, так что такая обратная совместимость все равно не работает. Хотя вроде и в Win32-приложении можно просто открыть файл «COM1» и оно будет работать с com-портом, так что может для кого-то это все-таки нужно.
          Про тесты, я имел в виду, что раз это фича, в Windows должны быть интеграционные тесты, которые проверяют, что оно работает именно так.


          1. Alexeyslav
            05.11.2018 14:45

            А командный интерпретатор и не является 16-битным приложением. Для него совместимость нужна.


      1. Wan-Derer
        05.11.2018 13:58

        Свою-то систему можно тестировать хоть до посинения. Нельзя протестировать другие реализации файловой системы под другими ОС. Но какое-то поведение системы при появлении таких файлов можно предусмотреть, да.


      1. khim
        05.11.2018 15:06
        +1

        фича абсолютно не нужная, устаревшая больше 30 лет назад, но тем не менее заботливо поддерживаемая.
        Если бы она была ненужной её бы выпилили.

        Как указывает статья 15-летней давности скритов проверяющих существание директории через «финт ушами» if exist directoryname\nul и документов, в которых написано «чтобы сделать конфигурационный файл наберите copy con ...» со временем меньше не становится…


  1. river-fall
    05.11.2018 00:39
    -1

    Удивительная по своей бесполезности статья, а стиль так вообще за гранью.
    В Windows есть зарезервированные имена файлов, которые являются устройствами — этим предложением можно было ограничиться


  1. Shambler0
    05.11.2018 00:47
    +3

    Буквально вчера прочитал на StackOverflow про аналогичный фокус с папкой `....` (три и более точек подряд).

    «Работает» примерно также, за исключением того что файлы из этой папки не видны в большинстве программ, включая поиск. Explorer либо не может зайти в папку, либо показывает содержимое материнской папки. Total Commander при попытке зайти в неё выбрасывает в корневой каталог диска, хотя его поиск работает. Тем не менее, chkdsk не обращает на подобное внимания.

    Проблема опять же в совместимости с DOS, и, возможно, CP/M: запись «test.» воспринимается как файл «test» с пустым расширением. Это нужно, например, чтобы запретить DOS-программе добавлять своё расширение к файлу, например, если текстовому редактору при сохранении ввести имя файла «test», тот как правило запишет файл «test.txt»; чтобы сохранить файл без расширения нужно написать «test.»; многие windows-программы работают также. В результате парсер по умолчанию обрезает имя файла/папки "...." до пустой строки, а путь «C:\test\....\file.txt» превратится в «C:\test\\file.txt» что эквивалентно «C:\test\file.txt»

    Эти файлы и папки (AUX, LPT1, `....`) можно создать/удалить/переименовать командами используя синтаксис "\\?\диск:\полный\путь", например: `mkdir \\?\c:\test\aux` или `rmdir \\?\d:\test\....`. Функции WinAPI тоже понимают такую запись; Total Commander может даже сделать такой каталог текущим, достаточно ввести `cd \\?\c:\` в его коммандную строку.

    Поскольку подобные файлы/папки стандартными средствами не удаляются, некоторые во времена Windows XP использовали их, например, для создания на флэшке неудаляемой папки «D:\autorun.inf\NUL», не позволяющей вредоносам удалить её и создать не её месте вредоносный файл «autorun.inf».


    1. DWZ
      05.11.2018 10:01
      +2

      Одно время был вирус, который прятал все папки из корневого каталога в каталог с длинным именем ".." (две точки) в корневом каталоге. При этом:

      1) Система позволяла создавать такой каталог (две точки да ещё и в корневом каталоге — это улёт)
      2) Ни FAR, ни ПРоводник этот каталог не видели
      3) chkdsk не находил ничего предосудительного
      4) имеющиеся под рукой антивирусы вирус прибивали, но папку ".." оставляли как есть.

      В результате приходит человек с флешкой, она почти вся занята, а на ней — ПУСТО.

      Приходилось использовать короткие имена. Там этот каталог назывался «E2E2~1», хотя логичнее было бы «2E2E~1»


      1. ICELedyanoj
        05.11.2018 10:59
        +5

        Я знаю о ещё более забавном случае. Жила-была СХД, использовавшаяся бэкап-софтом для хранения данных.
        Иерархия хранилища была простая — \ПапкаХранилища\ИмяКомпании\ИмяАккаунта
        При разработке немного завтыкали с валидацией имени аккаунта, и одна из компаний в тестовых целях создала себе аккаунт с именем "..".
        На СХД периодически запускались скрипты, которые чистили хранилище от данных неактивных аккаунтов. Создатель скрипта, не подозревая о такой подставе, не учёл возможность существования аккаунтов с именем "..", в итоге purge-скрипт добрался до этой папки, поднялся с уровня ИмяАккаунта на уровень ИмяКомпании и… Правильно, начал чистить другие ни в чём не повинные компании.
        На СХД хранились террабайты данных, для Purge-скрипта нормальным было работать долго, поэтому никто особенно не парился мониторингом его работы — запустили на выходные и пошли себе отдыхать.
        К тому моменту, как админы заподозрили неладное, скрипт успел пережевать пару компаний.
        К счастью — бОльшую часть удалённых данных удалось восстановить разными способами.
        Весьма поучительная история. Всегда валидируйте пользовательский ввод, зеркалируйте данные (особенно данные бэкапов), мониторьте скрипты.


        1. DWZ
          06.11.2018 08:33

          Тоже история про две точки. Некоторая организация рассылает письма с файлами, назвннными как контрагентов-получатель по типу «ЧП Иванову И.И.». В XP-шные времена, когда пользователь задавал в GUI имя файла с точкой на конце, она обрезалась и получалось «ЧП Иванову И.И.docx», например. В Проводнике и пободных окнах отображалось без второй точки «ЧП Иванову И.И», было некрасиво. Поэтому в Висте решили эстетствовать и файл стал именоваться «ЧП Иванову И.И..docx» с двумя точками перед расширением. В результате в Проводнике отображается нормально "«ЧП Иванову И.И.», но зато появилась проблема с OutLook Express.

          Он считал, что разрешение не «docx», а .docx" (с точкой) и отказывался открывать файл с неизвестным расширением. Причём выбрать, какой программой открывать неизвестное расширение он не давал. Приходилось сохранять такой файл на диск и уже там при открытии выполнять привязку программ с расширением. И так для каждого такого расширения. Я даже хотел универсальный обработчик написать.

          Особенно запомнился "..pdf". Его таким образом привязать почему-то не удавалось — Outlook Express рисует PDF-ный значок, а всё равно — «неизвестный тип файла».


          1. roscomtheend
            06.11.2018 16:10

            Сколь помню — значок там получается из системы запросом «дай мне значок на это имя файла» или «это расширение». А оно могло работать корректно (не беря последнюю точку).


            1. DWZ
              06.11.2018 17:02

              Так дело в том, что у других расширений было всё наоборот — картинка не показывается, зато привязка через сохранение файла на диске с запуском работает, а вот ..PDF «рыжим» оказался. С диска работает, из OutLook Express — ни в какую.

              При том, что в реестре ничего подозрительного для PDF не было.


  1. kaleman
    05.11.2018 01:28

    Высосонное из пальца словоблудие. Почему это вообще на хабре?


  1. Joric
    05.11.2018 02:38
    +1

    Стиль ютуба теперь на хабре? Почему весь текст не капсом?


  1. lamik
    05.11.2018 03:38

    с\con\con в win95/98 даже по локальной сети работал.
    \\ip_address\c\con\con
    Мы так развлекались на парах, кидая в синюю смерть соседние компьютеры.


  1. wtigga
    05.11.2018 06:06

    В те времена только изобрели штрих-коды, в Америке работала лишь одна телефонная компания, Тед Банди ещё бегал на свободе, а рекорд Бейба Рута по хоум-ранам стоял последние дни.


    За это ненавижу переводные статьи на Хабре. Никак авторы не разумеют, что эту региональную одним американцам понятную шелуху при переводе можно опустить.


    1. WondeRu
      05.11.2018 11:58
      +1

      Тоже трясет от такого


    1. BubaVV
      05.11.2018 13:27

      Чикатило еще работал мастером в ПТУ, а Пахтакор блистал в Высшей лиге? Или про Блюменштрассе уже все знали, а про 3-ю улицу Строителей — только жители соседних домов?


      1. wtigga
        05.11.2018 14:20

        Нет.

        В те времена только изобрели штрих-коды, в Америке работала лишь одна телефонная компания, Тед Банди ещё бегал на свободе, а рекорд Бейба Рута по хоум-ранам стоял последние дни.

        Когда появился этот баг, по телевизору ещё не показывали «Колесо Фортуны» (российский аналог: «Поле чудес», 1990 год — прим. пер.). Никто не видел «Шоу ужасов Рокки Хоррора», а Стивен Спилберг снял несколько телефильмов и один полноэкранный фильм, провалившийся в кинопрокате (но картина «Дуэль» получила несколько кинопремий — прим. пер.). По NBC не показывали «Субботним вечером в прямом эфире», а «Эдмунд Фицджеральд» ещё перевозил железную руду (гигантский сухогруз с экипажем затонул 9 ноября 1975 года — прим. пер.).

        КОГДА ИЗОБРЕЛИ ЭТУ ГЛУПУЮ «ФИЧУ», НА ЭКРАНЫ ТОЛЬКО ВЫШЛА ВТОРАЯ ЧАСТЬ «КРЁСТНОГО ОТЦА».


        сокращается до

        В те времена только изобрели штрих-коды.


        Это нормально, не нужно этого стесняться.


  1. s-kozlov
    05.11.2018 08:04

    Это не баг, это фича. Просто ребята из MS поняли ценность обратной совместимости еще в бородатые 80-е, а кое-кто не понял до сих пор.


    1. vershinin
      05.11.2018 10:54
      -2

      Ага, скажите это тем, кто пилит .net.


      1. Naglec
        05.11.2018 11:45
        +2

        А что не так?


        1. DistortNeo
          05.11.2018 14:55

          Пока что единственное, что меня коробит — отсутствие IEquatable<> и IComparable<> для типов-перечислений. Вводить не хотят, аргументируя обратной совместимостью.


          1. mayorovp
            05.11.2018 17:08

            А зачем они там? EqualityComparer.Default и Comparer.Default и без них работают…


            1. DistortNeo
              05.11.2018 23:41

              Затем, что я не могу их использовать в качестве generic-параметров, одним из ограничений на которые является IEquatable<>. А отказываться от этого ограничения и использовать EqualityComparer.Default внутри кода я не считаю правильным:


              1. Наличие явного указания требования на сравнимость типов значительно повышает понятность кода. Я предпочитаю статическую типизацию, а не вычисление компаратора в процессе работы программы.


              2. Снижается производительность. При использовании EqualityComparer.Default всегда используется виртуальный вызов, тогда как вызов .Equals() с большой вероятностью вообще заинлайнится, особенно если используется тип-структура.



      1. s-kozlov
        06.11.2018 09:23

        Есть мнение, что пилят .net другие люди с другими ценностями. Слово Joel Spolsky: www.joelonsoftware.com/2004/06/13/how-microsoft-lost-the-api-war


  1. Compiller
    05.11.2018 08:31

    В DOS под Windows 3.1 или 95 или 98 нельзя было обозвать папку mscdex001 (и прочие имена устройств) — так система по умолчанию именовала первый CDROM.
    А в папку autorun.inf на разных дисках клали USB vaccine — файл с именем lpt или подобным, но это уже гораздо позже, во времена XP


  1. Aldu_boy
    05.11.2018 10:01

    Есть более неприятный и почему-то малоизвестный баг — нельзя именовать файлы cmd и bat командами DOS, иначе такой файл невозможно будет запустить в интерпретаторе. Скажем, файл robocopy.cmd при запуске сразу будет закрыватьчся без исполнения


    1. mayorovp
      05.11.2018 11:00

      Где-то вы ошиблись


    1. mistergrim
      05.11.2018 14:01

      Robocopy — не команда интерпретатора, оно подчиняется всем правилам обхода исполняемых файлов.


    1. DistortNeo
      05.11.2018 14:56

      Может, нельзя будет запустить без явного указания расширения?


  1. Lsh
    05.11.2018 13:14

    Так это… В 10-ке всё ещё можно так распечатать на принтере текстовый файл из командной строки?
    Подозреваю, что уже нельзя (принтера нет, 10-ки тоже). Когда можно было последний раз? В 3.11, в 95?


    1. Squoworode
      05.11.2018 14:09

      А разве эту фичу поддерживал кто-то, кроме матричных принтеров? Ушли принтеры — ушла и возможность…


      1. khim
        05.11.2018 17:35

        Вы не поверите, но… все PCL5e принтеры (а их сейчас большинство) так отлично умели и умеют.

        Единственное но: не забывайте ^L посылать, а то оно так и будет ждать, пока вы страницу заполните до конца!


        1. Squoworode
          06.11.2018 18:58

          Ну ладно, кроме LPT-принтеров.
          Сейчас попробовал copy con prn (у меня самсунг 1865 на USB) — не удается найти указанный файл.
          P.S. Я, вообще, и имел в виду эпоху бытовых LPT-принтеров, но что-то не то написал.


          1. khim
            07.11.2018 01:37

            Сейчас попробовал copy con prn (у меня самсунг 1865 на USB) — не удается найти указанный файл.
            Я не знаю как в Windows 10, но в Windows 98 точно можно было для USB принтера указать, чтобы он висел на LPT1.

            Если даже это уже не работает, то скорее всего его можно расшарить и потом подконнктится через net use lpt1 \\COMPUTER\PRINTER /persistent:yes


    1. Alexeyslav
      05.11.2018 14:51
      +2

      Можно. Если найти под неё контроллер с LPT-портом, подключить принтер по LPT, скорей всего он будет матричным и… будет печатать аж на бегом. Где-то видел проги которые делают виртуальный принтер на LPT и печать перенаправляется на принтер установленный в системе.


      1. Am0ralist
        05.11.2018 22:12

        Где-то видел проги которые делают виртуальный принтер на LPT и печать перенаправляется на принтер установленный в системе.
        А зачем для этого проги? Максимум батник в авторан юзера закинуть…
        net use lpt1 \\localhost\MyPrinter /persistent:yes


      1. Lexxnech
        06.11.2018 11:15

        Если найти под неё контроллер с LPT-портом, подключить принтер по LPT, скорей всего он будет матричным

        Это, кстати, отнюдь не экзотический сценарий. LPT-шные матричные принтеры, например для печати чеков, вполне себе используются и матплаты с выведенными на заднюю панель LPT и COM портами не редкость. В тех же банках, где операции на полноценном компе а не на кассовом аппарате проводятся, вполне можно с таким столкнуться.


        1. AquiHostStrider
          06.11.2018 11:42

          Вообще-то чеки и квитанции печатаются на термоигольчатых принтерах в 99% случаев, подключаемых по USB, причём у половины из них проприетарный API, то есть их как обычный принтер использовать не получится. В кассовых и операционных залах отделений банков матричники массово использовали до 2012-2014 годов, потом стали от них отказываться в пользу лазерных. Остались они разве что в кассах некоторых отделений Ощадбанка в райцентрах. Сейчас матричники в банках используются разве что в отделах обслуживания юрлиц и в отделах статистики, причём строго для внутренних целей, где нужна печать на рулоне.


          1. Lexxnech
            06.11.2018 12:57

            Ну вот из того, с чем я лично сталкивался, Epson TM-U950. Вполне еще в продаже, подключается по LPT. Как минимум Сбербанк на таких сидит, причем продолжает закупать, гуглится закупка осенью 2017 года 600 штук. Поставщик Avrorus божится, что так же эта модель используется Россельхозбанком, ВТБ24, Банком Москвы и неупомянутыми «другими крупными учереждениями». Это все входит в оставшийся 1%, не подключающийся по usb?


        1. Alexeyslav
          06.11.2018 17:36

          Это очень большая редкость. Обычно портов нет вообще, за очень редким исключением. У меня, правда, на относительно новый компьютер искал материнку с 3-мя PCI слотами, я внимания не обратил но когда стал ставить оказался приятно удивлён — в наличии и COM и LPT-порт на задней панели! Неттоп, правда довольно старенький уже по меркам прогресса, на плате разъёмы под LPT/GPIO и 4 разъёма под аппаратные COM-порты. Но это опять же — исключения, довольно редкие.


          1. Lexxnech
            07.11.2018 11:21

            Это очень большая редкость. Обычно портов нет вообще

            Вы это так пишите, как будто это вероятностное событие, типа «есть LPT порт — печатаем, нет порта — облом». Это же сценарии корпоративного использования — если в кампании используются LPT-принтеры, то подходящее оборудование будет закупаться целенаправлено. А будет это порт на материнке или внешний контроллер будет зависеть от того, как дешевле. Скажем, материнка с готовым портом дороже материнки без него плюс контроллер, но проще в сопровождении. Или закупаются готовые системники с такой материнкой, и если ставить отдельный контроллер, то будет сложнее с гарантийщиками.
            При этом LPT это не экзотика, материнки и контроллеры есть в обычных магазинах (в Ситилинке сейчас посотрел, 12 моделей матерей и 3 модели контроллера) не ISA какая-нибудь.


  1. SirYorikTomsky
    05.11.2018 13:47
    +1

    самое интересное, это не «баг», и не «ошибка»…


  1. Karpion
    05.11.2018 16:07
    -2

    В Unix это делается через специальные файлы, существующие в специальных папках, как /dev/tty для консоли или /dev/lp0 для первого принтера. Вы можете получить бесконечный поток нулей из /dev/zero, случайные байты из /dev/random и т.д.!
    В старых Unix — это делалось через файлы, реально присутсвовавшие на диске. Т.е. после выключения компьютера можно было взять диск и найти на нём эти имена — каталог "dev" в корневой файловой системе, а в нём — "tty и прочие (смотреть диск можно было на любом компьютере — в т.ч. и таком, который ничего не знает про специальное значение этих файлов).

    В современном FreeBSD (про другие я как-то не интересовался) — каталог "dev" в корневой файловой системе присутствует, но в нём нет никаких файлов — он пустой. Все специальные файлы создаются в специальной виртуальной файловой системе, предназначенной только для таких вот специальных файлов; и эта файловая система монтируется в /dev (а при необходимости — ещё и в дополнительные точки; например, этого требует named при запуске в chroot). При выключении компьютера эти файлы пропадают.

    Но без директорий вы не можете поместить свои файлы в каталог /dev/.
    Ну и что, что нет такого каталога? Никто не мешает создать для спец.файлов виртуальный каталог — и распознавать спец.файлы по префиксу "/dev".

    И с расширениями проблем тоже не будет.

    Специальные файлы теперь могут быть в ЛЮБОМ КАТАЛОГЕ и С ЛЮБЫМ РАСШИРЕНИЕМ.
    Ага. И в командных файлах для проверки существования каталога можно использовать хак:
    IF EXIST диск:\каталог\nul
    Результат будет отличаться от случая, когда есть просто файл с таким именем.

    Конечно, мы не запускаем DOS 2.0… Но Windows 95 построили поверх DOS. Естественно, она унаследовала это поведение (как и Windows 1/2/3 ранее).
    Осталось понять, зачем надо было тащить это в 32-битный API. Можно было бы оставить это в 16-битном API, но не портировать дальше.

    Гэри Килдалл позаимствовал отличную идею из Unix
    Подобное заимствование отдельных частей обычно плохо заканчивается. Например, в Unix работает конструкция
    yes | программа
    А в DOS она не сработает, если портировать туда программу yes.

    Microsoft приводит полный список запрещённых названий: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9.
    Уж могли бы сделать имена этих файлов в таком виде/формате, который не поддерживается файловой системой. Например, добавлять им всем в конец двоеточие — запретный для файловой системы символ.
    Т.е. тут мы имеем проблему на этапе портирования функции в DOS. Что же — очередное доказательство криворукости Билла Гейтса.

    Если вам интересно, как у меня появился «запрещённый» файл, который нельзя скопировать, то скажу. Эти имена специальных устройств реализуются на уровне ОС, а не на уровне файловой системы. Таким образом, это совершенно допустимые имена файлов NTFS, а я использовал диск NTFS под Linux.
    Разные драйверы NTFS могут иметь разные представления о допустимости тех или иных имён.

    CP/M не реализовала их на уровне ОС, как в DOS! Они были просто включены в PIP, команду копирования файлов.
    Крайне неудачное решение.

    Обратная совместимость, в общем, хорошая вещь.
    Ну-ну, особенно совместимость с вирусами…


    1. khim
      05.11.2018 17:50

      Но без директорий вы не можете поместить свои файлы в каталог /dev/.
      Ну и что, что нет такого каталога?
      Вы это. Немного недоперепоняли. Не не «такого каталога». Нет никакого каталога. В CP-M и в MS-DOS 1.0 вообще не было понятия «каталог»!

      Никто не мешает создать для спец.файлов виртуальный каталог — и распознавать спец.файлы по префиксу "/dev".
      Гениально, блин! А теперь посмотрите на FCB и скажите — куда вы собрались ваш префикс засовывать, если под наименование файла выделено 99 бит (не байт! в 13 байтах, отведённых под имя файла старшие биты были «забраны» под аттрибуты файлов — тут подробнее описано).

      Осталось понять, зачем надо было тащить это в 32-битный API. Можно было бы оставить это в 16-битном API, но не портировать дальше.
      Потому что исходники всё это использовавших 16-битных программ нужно было уметь перекомпилировать без изменений под 32-бита?

      OS/2 решили «почистить API» при переходе с реального режима в защищённый — результат всем известен.

      А в DOS она не сработает, если портировать туда программу yes.
      Зависит от программы. Со многими программами — отлично срабатывает, но не со всеми. Ну так и в Unix — оно не со всеми программами работает.

      Уж могли бы сделать имена этих файлов в таком виде/формате, который не поддерживается файловой системой.
      А как тогда вводить их, если они будут отвергаться API?

      Что же — очередное доказательство криворукости Билла Гейтса.
      Ну если умение делать программы, которые люди будут хотеть использовать называть «криворукостью»…

      CP/M не реализовала их на уровне ОС, как в DOS! Они были просто включены в PIP, команду копирования файлов.
      Крайне неудачное решение.
      Вы уж определитесь — вы «за» костыли или «против». Потому как без использования костылей никак иначе требовать вводить двоеточие не получится: в FCB для этого двоеточия попросту нет места!


      1. Karpion
        05.11.2018 21:43

        Вы это. Немного недоперепоняли. Не не «такого каталога». Нет никакого каталога. В CP-M и в MS-DOS 1.0 вообще не было понятия «каталог»!
        Да всё я прекрасно понял. Это Вы меня не поняли.

        Вы утверждаете: «в операционной/файловой системе не было каталогов». Да, я в курсе. Но как это мешает работать команде
        PIP /DEV/LST=FOO.TXT
        ? Особенно если это это сделано на уровне программы PIP?

        А теперь посмотрите на FCB и скажите — куда вы собрались ваш префикс засовывать, если под наименование файла выделено 99 бит
        99 бит = 12 байт + 3 бита.
        "/DEV/LST" = 8 байт.
        У нас осталось четыре байта.

        Потому что исходники всё это использовавших 16-битных программ нужно было уметь перекомпилировать без изменений под 32-бита?
        Я не верю, что вообще все без исключений 16-битные исходники можно было портировать по 32 бита без изменений. Вот и в данном случае — можно было депрекатнуть эту фичу, благо это был самый подходящий момент.

        OS/2 решили «почистить API» при переходе с реального режима в защищённый — результат всем известен.
        При переходе с W'9x на W'NT/2000/etc — API тоже почистили. Результат был отменный.
        Не в этом причина коммерческого успеха. IBM просто просрала рынок персональных компьютеров изначально — и потом ни разу не пыталась принять реальные шаги, способные сделать её лидером этого рынка.

        Ну так и в Unix — оно не со всеми программами работает.
        Жду примера.

        А как тогда вводить их, если они будут отвергаться API?
        У операционки — много компонент. API какого компонента будет отвергать такие имена?
        Вроде, мы вообще говорим о временах, когда API только создавался. И вполне можно было сделать так, чтобы API верхнего уровня принимал такие имена, а дальше в файловую систему попадали только валидные для неё имена; а остальные попадали бы в систему обслуживания спец.файлов.

        Ну если умение делать программы, которые люди будут хотеть использовать называть «криворукостью»…
        А тут вопрос не в умении делать программы. Чтобы люди хотели чего-то — в первую очередь нужен маркетинг.

        Вы уж определитесь — вы «за» костыли или «против». Потому как без использования костылей никак иначе требовать вводить двоеточие не получится: в FCB для этого двоеточия попросту нет места!
        Если ограничить имя спец.файла «на один байт короче, чем допускает файловая система» — то нет никакой проблемы.
        Как вариант — если для спец.файлов запрещены расширения, то двоеточие как раз влезает, и ещё два байта свободны.


        1. khim
          06.11.2018 00:33

          Но как это мешает работать команде
          PIP /DEV/LST=FOO.TXT
          ? Особенно если это это сделано на уровне программы PIP?
          В коменда PIP слеши использовались для задания опций (как во многих программах DOS потом). Но да, в принципе это никому не мешает.

          А теперь посмотрите на FCB и скажите — куда вы собрались ваш префикс засовывать, если под наименование файла выделено 99 бит
          99 бит = 12 байт + 3 бита.
          "/DEV/LST" = 8 байт.
          У нас осталось четыре байта.
          Вот только вы тем самым создали нечто, что не выглядит, как имя файла. Оно содержит запрещённые символы. И нужно как-то особо его обрабатывать, чтобы оно через все программы прошло. Заметим, что делаете вы всё это для системы, в которой свободной памяти — 16K. Для PC DOS и для программ, для всего.

          Я не верю, что вообще все без исключений 16-битные исходники можно было портировать по 32 бита без изменений.
          Нет, конечно. Там были интересные истории с wParam и lParam.

          Вот и в данном случае — можно было депрекатнуть эту фичу, благо это был самый подходящий момент.
          Не очень понятно как вы это себе представляете. Вы не забываете, что 32-битные программы вначале запускались в течении 6 лет поверх 16-битной операционки? То есть к моменту, когда появилась полностью 32-битная операционка, в которой эту фичку, как-бы-типа-может-быть-и-можно было бы отключить — уже появилась куча 32х битных программ, которые её использовали?

          При переходе с W'9x на W'NT/2000/etc — API тоже почистили.
          А что именно там почистили? Я только про отказ от поддержки FCB знаю. Так FCB была к этому моменту уже 18 лет как deprecated. Хотя пользователи WordStar бузили, да.

          IBM просто просрала рынок персональных компьютеров изначально — и потом ни разу не пыталась принять реальные шаги, способные сделать её лидером этого рынка.
          Как это не пыталась? А OS/2 с ABIOS и прочее? Она пыталась. Но она как раз делала так, как вы предлагаете: «красиво» и «правильно». А людям нужно было «шоб работало».

          Ну так и в Unix — оно не со всеми программами работает.
          Жду примера.
          Да хотя бы браузер, в котором вы этот текст набираете. Или вы каким-то образом Lynx к Хабру прикрутили?

          А как тогда вводить их, если они будут отвергаться API?
          У операционки — много компонент. API какого компонента будет отвергать такие имена?
          Не так и много у PC DOS 1.0 компонент. Но Ok, INT 21h, AH=0Fh. Там проверка валидности имени осуществляется «на входе», до того, как передать FCB в файловую систему.

          Вроде, мы вообще говорим о временах, когда API только создавался.
          Нет. Мы говорим о временах, когда Microsoft писал операционку под уже существующий API.
          CP-M API был воссоздан весьма тщательно, вплоть до CALL 5 интерфейса.

          И вполне можно было сделать так, чтобы API верхнего уровня принимал такие имена, а дальше в файловую систему попадали только валидные для неё имена; а остальные попадали бы в систему обслуживания спец.файлов.
          Всё так и было сделано — «правильными людьми» с «правильной технологией» в правильной OS. Про неё даже есть статья в Wikipedia! А пользователей… пользователей нету, да.

          А тут вопрос не в умении делать программы. Чтобы люди хотели чего-то — в первую очередь нужен маркетинг.
          Ваy! Расскажите же как в вашу вселенную, где все люди пользуются Windows Phone попасть — через червоточину или ещё как? Потому что в нашей вселенной маркетологи чёт ну никак не смогли справится с тем, чтобы это «правильную» OS кому-то впарить. Причём, что характерно, кривую, неправильную, ужасную «хрень» созданную под руководством Билла Гейтса и «настоящий», «правильно спроектированный», сделанный «по науке» Windows Phone — маркетологировали вот ровно те же самые люди… только в противоположным результатом. Притом что у них ещё и много миллирдов на рекламу было и куча лет опыта, чтобы понять как всё правильно маректологировать. Всё равно фиг вам вышел.

          Как вариант — если для спец.файлов запрещены расширения, то двоеточие как раз влезает, и ещё два байта свободны.
          Вот только это — всё равно ломает весь API. Потому что какой-нибудь IBM Pascal берёт от вас имя файла, обрезает его на 8 байт и безусловно к нему приписывает расширение. Ешё и ругается, зараза, когда вы пытаетесь больше одного символа перед двоеточием написать.

          Понимаете — человек во многом при написании программ повторяет тот процесс, которым получился он сам. Выбирается всегда локально-оптимальное решение на основе того, что есть «здесь и сейчас». Мы с вами ходим на двух ногах (что, вообще говоря, дико неэффективно), потому что в тот момент, когда эволюция доковыляла до того, чтобы мозг смог эффективно обслуживать руки — все позвоночные уже были с четырьмя конечностями, других не было.

          Точно так же и дизайн Windows XP был ограничен дизайном Windows 95, которой приходилось мириться с возможностями MS DOS, который был создан так, чтобы в нём можно было запускать программы для CP-M! Причём программы, написанные на ассмеблере (собственно дизайн 8086 был именно таким, потому что такая возможность в нём была изначально заложена).

          И сделать так, чтобы фича, которая в CP-M была ограничена (только PIP использовать всякие CON: и LPT:) работала бы во всех программах без добавления в них особого, специального кода — было разумно. Это реально сделало PC DOS удобнее, чем CP-M! А что потом, через 37 лет — от этого будут страдать люди, копирующие файлик из комплекта OpenGL… об этом никто не думал… вернее кое-какие люди думали — и их даже немало было, но… их операционки «сошли с дистанции» и «потомства» не оставили…


          1. Karpion
            06.11.2018 21:18

            В коменда PIP слеши использовались для задания опций (как во многих программах DOS потом).
            Т.е. автор CP/M взялся портировать что-то из Unix и не стал портировать форму задания ключей оттуда? Поразительная криворукость!

            Вот только вы тем самым создали нечто, что не выглядит, как имя файла.
            Ой, а почему оно «не выглядит»? Может, потму, что изначально был задан другой стандарт?
            Ну так изначально надо было делать нормально!

            Кстати, использовать приставку "/dev/" действительно слишком накладно. Ну, можно было двоеточие в конце — и изначально задать в стандарте «двоеточие означает устройство».
            Правда, и тут засада: буква диска с двоеточием д.б. устройством, но оно не обозначает дискету в том смысле, в котором это делает "/dev/fda", которое предлагает читать содержимое дискеты посекторно.

            Вы не забываете, что 32-битные программы вначале запускались в течении 6 лет поверх 16-битной операционки?
            Это Вы про что? W'NT появилась задолго до W'95, не говоря уж про Win32s (приблуду, позволявшую запускать некоторые 32-битные программы на W'3.11).

            А что именно там почистили {при переходе с W'9x на W'NT/2000/etc}?
            Ну, например, жёстко пресекли привычку программ писать в системную директорию — надо писать в директорию юзера.

            Как это не пыталась {принять реальные шаги, способные сделать её лидером рынка персональных компьютеров}? А OS/2 с ABIOS и прочее?
            Ну так это было позорная попытка покушения на рынок с негодными средствами.

            Ну, начнём с того, что OS/2 — это рынок операционок, а не персональных компьютеров. Т.е. изначально Вы привели пример, только подтверждающий мою т.з. — шаги были, но глупые.

            Первое, что надо было делать — это отказываться от писюковой совместимости. Т.е. взять нормальный RISC-процессор типа ARM или MIPS. Сбросить тяжкое наследие совместимости, все эти «640 килобайт», дебильный BIOS и прочее. Одновременно — сбросить совместимость с вирусами.

            Затем — желательно было делать операционку типа Unix. Т.е. — многопользовательскую и многозадачную. Работал же Unix на PDP-11 с её 128 KB RAM.

            Крайне желательно — сделать компьютер с операционкой в ПЗУ. Микросхема ПЗУ — заменяемая, но не пробиваемая для вирусов.
            Одновременно — делать компьютер таким, чтобы тот одинаково хорошо работал и с локальныи накопителями, и с сервером. Сразу же приготовить серверы в широком диапазоне — от дешёвого (ценой дешевле компьютера — за счёт отсутствия видеокарты и прочего ненужного серверу) до супермощного. Это позволит успешно атаковать рынок мелких контор на пять компьютеров — не надо будет бегать с дискетами. Сети тоже д.б. широкого диапазона — дешёвая в пределах комнаты, дорогая на большое здание, плюс возможность коммутации разных офисов по телефонной линии.

            IBM же выбрала дурацкое решение: выпустила патентованную PS/2, но совместимую с писюками. Т.е. никто другой не работал на популярность платформы, но совместимость портила жизнь. И на этой PS/2 можно было запускать DOS — это работало на Билла Гейтса.
            А OS/2 не слишком хорошо работала на компьютерах других производителей.

            Да хотя бы браузер, в котором вы этот текст набираете. Или вы каким-то образом Lynx к Хабру прикрутили?
            Вы как-то резко перешли от «I/O redirect в Unix» к Lynx и Хабру. Я не понял.

            INT 21h, AH=0Fh. Там проверка валидности имени осуществляется «на входе», до того, как передать FCB в файловую систему.
            Замечательно. Вот в этом месте и надо было изначально делать правильно — имена файлов одного типа передавать в файловую систему, другого типа — в драйверы. В Unix всё это есть, и именно так — правда, я не знаю, когда это сделали; и там не по имени определяют, а по типу файла.

            Мы говорим о временах, когда Microsoft писал операционку под уже существующий API.
            CP-M API был воссоздан весьма тщательно, вплоть до CALL 5 интерфейса.
            Была ли в этом API работа со спец.файлами?
            Я так понял — сец.файлы ввели потом. И на момент их введения — им надо было дать особые имена.

            Всё так и было сделано — «правильными людьми» с «правильной технологией» в правильной OS.
            Байт-код — в те времена не мог быть правильным решением.

            Причём, что характерно, кривую, неправильную, ужасную «хрень» созданную под руководством Билла Гейтса и «настоящий», «правильно спроектированный», сделанный «по науке» Windows Phone — маркетологировали вот ровно те же самые люди… только в противоположным результатом.
            Во-первых, те люди, которые выводили на рынок DOS и первые Windows — либо давно уволились, либо состарились. Т.е. — не те же самые люди, а другие.
            Во-вторых, надо понимать, что DOS и первые Windows выводились на только что созданные или даже ещё не созданные рынки. А Windows Phone выводился на рынок, где уже вовсю работали другие игроки.
            Но главное — при выходе на рынок смартфонов Билл Гейтс не имел поддержки от IBM. Т.е. никто не энфорсил выпуск телефонов именно под Windows Phone — а в честной конкуренции выиграть не удалось.

            Windows сильна на рыке, который она захватила. Т.е. на рынке персональных компьютеров.
            Windows имеет неплохие шансы на рынках, тесно связанных с рынком персональных компьютеров — это клавиатуры, мышки, ноутбуки, серверы.
            Windows неплохо выступала на рынке смартфонов/планшетов/etc — но только пока эти устройства взаимодействовали с компьютером, а на компьютерах была Windows. Как только смартфоны/планшеты/etc стали самостоятельно выходить в сеть — Windows сдулась, ибо IBM или кто-то другой такого масштаба ей уже не помогала.

            Притом что у них ещё и много миллирдов на рекламу было и куча лет опыта, чтобы понять как всё правильно маректологировать.
            А вот опыт здесь только вредил. Потому что это был опыт работы на уже покорённом рынке.

            IBM Pascal берёт от вас имя файла, обрезает его на 8 байт и безусловно к нему приписывает расширение.
            А зачем IBM Pascal собирается обращаться к спец.файлам? Правильно обрезает — для него имя файла д.б. валидным по меркам файловой системы!

            И сделать так, чтобы фича, которая в CP-M была ограничена (только PIP использовать всякие CON: и LPT:) работала бы во всех программах без добавления в них особого, специального кода — было разумно.
            Двоеточие потребует специального кода???


            1. khim
              07.11.2018 01:33

              В коменда PIP слеши использовались для задания опций (как во многих программах DOS потом).
              Т.е. автор CP/M взялся портировать что-то из Unix и не стал портировать форму задания ключей оттуда? Поразительная криворукость!
              Действительно — чего уж там. Увидев Unix на конференции (попробовать его в деле тогда ещё нельзя было) — Киндал должен быть срочно забыть про всё то, чем до этого пользовались десятилетиями и всё сделать как в Unix. «Забив» на привычки и опыт, конечно.

              Вот только вы тем самым создали нечто, что не выглядит, как имя файла.

              Ой, а почему оно «не выглядит»? Может, потму, что изначально был задан другой стандарт?
              Ну так изначально надо было делать нормально!
              А нормально — это как? Копируя интерфейс несуществующей системы? Вы, вообще, в курсе, что PIP — несколько постарше Unix'а будет? И в тот момент, когда Киндал решил его улучшить, позаимствовав пару идей из Unix уже имел десятилетний возраст?

              Он должен был всё прям бросить и начать Unix копировать? Так такую операционку Microsoft тоже сделал! Только она не взлетела: очень дорого получилось из-за «космических» (по тем временам) требованиям к ресурсам.

              Вы не забываете, что 32-битные программы вначале запускались в течении 6 лет поверх 16-битной операционки?
              Это Вы про что? W'NT появилась задолго до W'95, не говоря уж про Win32s (приблуду, позволявшую запускать некоторые 32-битные программы на W'3.11).
              Ну не так и «задолго» до Windows 95 появилась — на два года всего. Но главное — как раз Win32s и Windows95. Особенно Win32s. Они, как бы, работали «поверх» DOS — и потому были ограничены тем, что он умеет. А главное — на этих операционках использовалось много 16-битных программ, которые по-прежнему использовали PRN и CON. И было бы странно обнаружить, что в 16-битных версиях net use lpt: ... работает, а в 32-битных вдруг нет…

              А что именно там почистили {при переходе с W'9x на W'NT/2000/etc}?
              Ну, например, жёстко пресекли привычку программ писать в системную директорию — надо писать в директорию юзера.
              Не очень-то это пресекли. Выстави права на каталог — и работай. Так и работали все. Под админом. Только в Windows Vista костыль подходящий завезли, чтобы это контролировать.

              Ну, начнём с того, что OS/2 — это рынок операционок, а не персональных компьютеров.
              Начнём с того, что вы так ни черта и не поняли. OS/2 и PS/2 изначально шли в паре. И были попыткой «переосмыслить» IBM PC/AT и сделать всё «как надо». И точно так же, как и «до того» были IBM OS/2 для «правильных» PS/2 и MS OS/2 для «всех остальных».

              Вот только рынок «не оценил» всех глубин замысла.

              Первое, что надо было делать — это отказываться от писюковой совместимости. Т.е. взять нормальный RISC-процессор типа ARM или MIPS. Сбросить тяжкое наследие совместимости, все эти «640 килобайт», дебильный BIOS и прочее. Одновременно — сбросить совместимость с вирусами.
              Ну то есть разработать PReP и PC Power Series? И портировать туда OS/2?

              Успех был таким «оглушительным», что вы, я думаю, даже не знаете об этой попытке всё сделать «правильно». Потому шта рынок на это посмотрел, подумал… и сказал, так веско, но внушительно: нам надо ШОБ РАБОТАЛО (в переводе на русский: а иде-ка вы со своими идеями… лесом).

              Сразу же приготовить серверы в широком диапазоне — от дешёвого (ценой дешевле компьютера — за счёт отсутствия видеокарты и прочего ненужного серверу) до супермощного.
              Видекарты там и не было. EGA — это Enhanced Graphics Adapter, а VGA — это Video Graphics Array — именно потому, что это была уже одна микросхема — и не очень дорогая.

              А вот цену выставить дешевле, чем на PC никак не получалось, так как RISC-процессоры, заказные микросхемы и прочее — денег стоили, а тиражи были невелики. А с учётом того, что IBM тогда теряла деньги со страшной силой возможности продавать ниже себестоимости у неё тоже не было.

              GSI и Sun, правда, провернули нечто похожее на ваши предложение — но тоже попали в ту же ловушку: какое-то время они могли конкурировать с рынком PC, но со временем x86 догнал их по производительности… и всё кончилось.

              Да хотя бы браузер, в котором вы этот текст набираете. Или вы каким-то образом Lynx к Хабру прикрутили?
              Вы как-то резко перешли от «I/O redirect в Unix» к Lynx и Хабру. Я не понял.
              Как в Unix, так и в MS-DOS перенаправление отлично работает для всех программ, которые используют функции работы с консолью. И не работает для всех остальных. И также, как в MS DOS народ пользовался не «православным» dBase II, в который можно было перенапрвлять что угодно, а «богомерзким» FoxPro, который эти механизмы не поддерживал — так же в и Unix люди пользуются на «православным» Lynx'ом, а «ужасными» Chrome и Firefox'ом. Более того, на Хабр запостить ничего из Lynx'а нельзя — так что вы точно тем же «грехом» страдаете.

              INT 21h, AH=0Fh. Там проверка валидности имени осуществляется «на входе», до того, как передать FCB в файловую систему.
              Замечательно. Вот в этом месте и надо было изначально делать правильно — имена файлов одного типа передавать в файловую систему, другого типа — в драйверы. В Unix всё это есть, и именно так — правда, я не знаю, когда это сделали; и там не по имени определяют, а по типу файла.
              А стоило бы узнать. Они это сделали за счёт добавления флага в структуру stat, но, основное и главное, за счёт наличия жёсткого диска. То есть ядро сначала обращается к файлу, узнаёт, что это — не файл, а специальное устройство, а потом уже идёт в ядро.

              А CP/M и DOS 1.0 должны были работать на системе без жёсткого диска, только с флопами. Которые, как бы, нужно было руками менять, чтобы добраться до файлов на системном диске. Потому «внезапное» предложение сменить диск при выдаче команды copy con file.txt только для того, чтобы посмотреть на файл con и понять, что он вам не нужен — никого бы не обрадовало.

              Потому было принято простое решение: драйвера названия своих устройств складывают в простую табличку и что там есть — то драйвер, чего нет — то не драйвер.

              Мы говорим о временах, когда Microsoft писал операционку под уже существующий API.
              CP-M API был воссоздан весьма тщательно, вплоть до CALL 5 интерфейса.
              Была ли в этом API работа со спец.файлами?
              Не было — и это, как раз, и было проблемой. В CP/M (как и в операционках 60х) спецфайлы существовали в программе PIP — и больше нигде. А MS-DOS — взял из Unix интересную идею (сделать драйвера разновидностью файлов) и добавил их в уже существовавший API CP/M.

              И на момент их введения — им надо было дать особые имена.
              В момент их введения — было уже поздно давать им особые имена, так как API уже был и программы, написанные под него уже тоже были. Хотя операционки ещё и не было. Вот такой парадокс.

              Всё так и было сделано — «правильными людьми» с «правильной технологией» в правильной OS.
              Байт-код — в те времена не мог быть правильным решением.
              Я, если честно, считаю, что они никогда не может быть правильным решением, но «правильные пацаны» считают иначе. Не только UCSD p-System, но и Texas Instruments и Wang считали — что это «то, что надо».

              Все они, конечно, сгинули, не оставив потомства, но… это мнение «правильных пацанов» не изменило.

              Во-первых, те люди, которые выводили на рынок DOS и первые Windows — либо давно уволились, либо состарились. Т.е. — не те же самые люди, а другие.
              PC DOS «на рынок» никто из Microsoft не выводил. Этим IBM занималась. А для продвижения MS-DOS и Windows был нанят маркетолог. Один маркетолог: Стив Баллмер. Который был как раз CEO Microsoft во время ужасного фиаско Windows Phone.

              Во-вторых, надо понимать, что DOS и первые Windows выводились на только что созданные или даже ещё не созданные рынки. А Windows Phone выводился на рынок, где уже вовсю работали другие игроки.
              Вы это серьёзно? Архитектура IBM PC завоевала первое место по популярности только примерно к 1984му. И первое место — это не 90 процентов с гаком, а где-то 30% (чуть меньше было у C64, дальше Apple ][ и так далее). После чего Apple «совершила революцию» со своими маками и потребовалось что-то с этим делать. Ну вот точь-в-точь ситуация как со смартфонами и iPhone.

              Однако подумать — не значит сделать. Первые Windows провалились с треском. И стало понятно, что «нужна смена парадигмы». Но когда она произошла, то Bill Gates, понимающий до копчика что такое «обратная совместимость» порвал с IBM и выпустил Windows 3.0, в которой можно было даже запускать программы от Windows 1.0 (написанные во времена, когда о защищённом режиме никто и не мечтал), а IBM — выпустила сначала «правильно спроектированную» связку OS/2 и PS/2 (несовместимую с программами Windows 1-2 и плохо совместимую с тогдашними программами для PC DOS), а когда это не помогло — затеяла PReP. Всё точь-в-точь как Microsoft с Windows Phone.

              С тем же результатом: жалкая кучка яростных фанатов — и дыра в кошельке. Как Microsoft под руководством «настоящих гуру» проделал тот же финт ушами и почему — я не знаю, но это точно было не с подачи маркетологов.

              Как только смартфоны/планшеты/etc стали самостоятельно выходить в сеть — Windows сдулась, ибо IBM или кто-то другой такого масштаба ей уже не помогала.
              А ничего в 90е, когда Microsoft выиграла битву за десктоп «IBM или кто-то другой такого масштаба» был с другой стороны баррикад?

              А вот опыт здесь только вредил. Потому что это был опыт работы на уже покорённом рынке.
              Ага. Работа «только на покорённом рынке». У человека, который был первым и долгое время единственным маркетологом в Microsoft. А кто ж до него этот рынок покорил, если маркетингом только он начал заниматься, извините? Какой, вообще, рынок Microsoft к 1980му году покорил?

              IBM Pascal берёт от вас имя файла, обрезает его на 8 байт и безусловно к нему приписывает расширение.
              А зачем IBM Pascal собирается обращаться к спец.файлам? Правильно обрезает — для него имя файла д.б. валидным по меркам файловой системы!
              Браво, ура! Возьмите с полки пирожок… а потом положите на место. Ибо IBM Pascal хочет обращаться к файлам, да, всё верно — а вот пользователь часто хочет увидеть ошибки либо на экране, либо на принтере. И, вуаля, MS DOS это позволяет (указываете PRN, который PAS1.EXE превратит в PRN.TXT — и смотрите на ваши ошибки на принтере), а другие операционки — так не умеют.

              И сделать так, чтобы фича, которая в CP-M была ограничена (только PIP использовать всякие CON: и LPT:) работала бы во всех программах без добавления в них особого, специального кода — было разумно.
              Двоеточие потребует специального кода???
              Конечно. Вот тот самый IBM Pascal, изначально заточенный под CP/M, проиyтерпретирует двоеточие как указание на имя диска. И, скорее всего, не допустит имя состоящее из более, чем одного символа перед двоеточием. А даже если допустит — то неизвестно что с ним сделает.


  1. r44083
    05.11.2018 16:15

    Стоит сказать, что именно по этой причине на Windows невозможно успешно выполнить:

    git clone https://github.com/torvalds/linux


    1. timdorohin
      05.11.2018 21:15

      Враг не пройдёт! XD


  1. leR12
    05.11.2018 19:57

    попа (ж… а ) в командной строке приводит винду в ужас и ступор. даже не думай это проверять!


  1. Neusser
    05.11.2018 20:15
    -1

    СЕНСАЦИЯ!!! Первый баг в виндовс появился на 11 лет раньше, чем сама виндовс!!!

    Как в Windows может сохраниться баг с 1974 года, если самая первая версия Windows вышла в 1985?


    1. khim
      06.11.2018 00:37

      Как в Windows может сохраниться баг с 1974 года, если самая первая версия Windows вышла в 1985?
      Дык. Столько лет бережно сохранять bug compatibility — это реально непросто. Но Microsoft справился. О чём и статья…


      1. Neusser
        06.11.2018 10:02

        Статья да, но не такой желтушный заголовок.


  1. seri0shka
    05.11.2018 23:57

    Раз уж зашёл разговор об именах файлов, кто мне подскажет, каким образом у меня завелась папка с названием "Ђ¤¬Ё­Ёбва в®а" рядом с «Администратор»? Переименовывать боюсь, потому как во многих программах прописан путь в неё.


    1. khim
      06.11.2018 00:45

      Кто-то попутал кодовые странички OEM и ANSI? Бывает… Тут, тут и тут можно почитать.


    1. sumanai
      06.11.2018 02:07

      Переименовывать боюсь, потому как во многих программах прописан путь в неё.

      Сделайте симлинк, хотя это тот ещё костыль, учитывая и так наличествующий зацикленных граф симлинков внутри \Users\


    1. dMac
      07.11.2018 13:13

      "Ђ¤¬Ё­Ёбва в®а" рядом с «Администратор»?
      Прям суровые будни администраторов


  1. MacIn
    06.11.2018 00:21

    Хоспаде. Опять эти страшилки про DOS alias'ы в общем пространстве имен — это уже что ли третья статья на хабре по этой теме.
    Да, есть программы, которые не смогут с такими именами работать, но ядро, API таких ограничений не имеет. Весь вопрос в том, resolve'ится ли имя через DOS alias или напрямую в \\?\


  1. glafir
    06.11.2018 12:36

    Человеческий фактор. Да, маркетинг теперь диктует правила. Для (старых?) ОС поддержку скайпа и пр. прекратили, но зато будет сохранять «обратную совместимость» с допотопной 4, 8 и 16-разрялностями. Я понимаю, что многие в Европе и США работают в ДОСе, но всё жеж. Деньги не пахнут, правда?


    1. khim
      06.11.2018 16:10
      +1

      Я вам больше скажу: маркетинг всегда диктовал правила. И будет их диктовать.

      Просто потому что компании, работающие в убыток имеют неприятную привычку со временем закрываться.

      Пользователи Windows (особенно пользователи серверной Windows) — платят за неё хорошие деньги… потому для них будут поддерживать совместимость с системами чуть не полувековой давности.

      А пользователи Skype денег, в массе своей, денег не приносят — потому ими особо и не жалеют. Купили Skype, чтобы продвигать Windows Phone, но… бобик сдох. А с монетизацией там… не особо. Так что имеем то, что имеем.



  1. mkostya
    06.11.2018 22:54

    Создавая con.txt через Linux (touch ~/con.txt) и пытаясь получить доступ к файлу из Windows через монтирование Linux системы на Windows диск, файл имеет имя CSHOFG~F.TXT