Керніган і Пайк виклик: як поставити косу рису в ім'я файлу?


23

Я щойно стикався з наступним питанням у середовищі програмування Unix , класичній книзі Керніган та Пайк про Unix (я знайшов поданий текст на стор. 79 від 1984 року видання, ISBN: 0-13-937699-2):

Вправа 3-6. (Хитрісне запитання) Як отримати / в ім’я файлу (тобто, а /, що не розділяє компоненти шляху?

Я працював з Linux роками як кінцевим користувачем, так і програмістом, але не можу відповісти на це питання. Немає можливості розміщувати косою рисою файли, ядро ​​це абсолютно заборонено. Ви можете зафіксувати вашу файлову систему за допомогою блокового доступу до пристроїв або використовувати символи подібного вигляду з Unicode, але це не рішення.

Я розумію, що для Linux ≠ Unix слід застосовувати той самий принцип, оскільки система повинна мати можливість однозначно витягувати ієрархію каталогів із шляхів.

Хтось знає, що саме думали Керніган та Пайк, задаючи ці питання? Яка була гадана відповідь? Що саме є "фокусом"? А може оригінальна система Unix просто дозволила якось уникнути цієї косої риси?

UPD:

Я зв’язався з Брайаном Керніган щодо питання, і він відповів:

Відповідь (або була) "Ви не можете".

Отже, Тимофі Мартін мав рацію і отримує зелену кліща.


3
Пов'язаний (не дублікат) випадок, коли хтось насправді ним керував: Як видалити файл з назвою "filen / ame" (з косою рисою) у файловій системі ext4 у налагодженнях?
Майкл Гомер


Хм. Можливо, ви могли б створити файл, що містить малі aрегістри, і змусити вашу систему думати, що файлова система знаходиться в мові EBCDIC? ASCII a- це 0x61, що відповідає /EBCDIC (кодова сторінка 37)
Fox

Чи каже сама книга, що це хитрі питання? Якщо це так, я думаю, що це майже підтверджує, що ви не зможете знайти похідний спосіб зробити це, залишаючи ідеї, які ви вже не заявляли, про які ви вже заявляли.
ilkkachu

Відповіді:


12

Можливо, відповідь така ж, як і частина відповіді в цьому хитромудрий запитання:
Як ти зійдеш зі слона? Ви цього не робите. Ви отримуєте його від гуски.

З «Практики програмування» Брайана В. Кернігана та Роб Пайк, гл. 6, пг. 158:

Коли Стів Борн писав свою оболонку Unix (яка стала називатися оболонкою Bourne), він створив каталог з 254 файлів з одноіменними іменами, по одному на кожне значення байта, крім '\ 0' та косою рисою, два символи, які не може відображатися в іменах файлів Unix.


3
Дякую, що ви навчили мене цього жарту. Можливо, це може послужити як тест на володіння англійською мовою (який я щойно не зміг).
firegurafiku

Ви були праві. Див. UPD.
firegurafiku


5

Я це зробив. Це було в системі UNIX, яка працює на PDP-11 десь близько 1980 року. Я створив файл під назвою "WhatXNow?". Потім я використав двійковий файл "редактор" для редагування дискового пристрою та зміни "X" на "/" в inode (при відключенні файлової системи).

Потерпілий ніколи не придумав, як його зняти.

Редагувати: так, Бармар має рацію, мені не вдалося побачити рядок про те, щоб не виправити пристрій. І так, це був каталог, який я редагував, а не inode. Пройшло багато часу :-)


1
Імена файлів не в inode, вони знаходяться в спеціальному файлі каталогу.
Бармар

1
Я підозрюю, fsckщо його зняли б.
Бармар

1
У запитанні йдеться про те, що ви можете виконати виправлення вашої файлової системи через доступ до блокового пристрою або використовувати символи подібного вигляду з Unicode, але це не рішення. Це не те, що ви описуєте у своїй відповіді?
Бармар

@Barmar: Хм, можливо, я переосмислюю питання і виправлення файлової системи - це рішення, яке малося на увазі? Не знаю.
firegurafiku

Б'юсь об заклад, це була відповідь. Я пам'ятаю, коли ви могли читати каталоги. Можливо, століття тому root міг їх написати.
Джошуа

1

Будь-який сценарій, де /(точніше, байт - не символ - зі значенням 0x2f; майже всі ядра Unix навмисно не зважають на кодування символів), потрапляє в запис каталогу, без того, щоб сирі блоки диска не були маніпульовані вручну, беззаперечно помилка в ядрі.

Такі помилки трапляються час від часу. Один з випадків, я пам’ятаю, читаючи ноти виправлень, - це те, що деякі ітерації епохи 1990-х років… Я хочу сказати Solaris, але це може бути помилково… запропонував сервер для протоколу подачі файлів AppleTalk (AFP), який був класичним еквівалентом MacOS NFS . Проблема полягала в тому, що на класичному MacOS вам дозволено вводити /компонент pathname; :натомість роздільник каталогів . Сервер AFP повинен був виконати моральний еквівалент tr :/ /:при зіставленні імен шляхів, поданих клієнтами, на файли на своєму диску, але вони пропустили пару кодових шляхів, і оскільки сервер був реалізований всередині ядра, він фактично міг виписати погані записи каталогів.

(Див. Відповіді на відповіді comp.unix № 2.2 , підрозділ, що починається "Що робити, якщо ім'я файлу має" / "у більш тривалій версії вище.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.