Задача Кернигана и Пайка: как поставить слеш в имени файла?

Если вы просто отбросите перенаправление ввода < в командной строке find, оболочка попытается перенаправить ввод, переданный на найти . Вы хотите, чтобы перенаправление выполнялось для команды, выполняемой find. Но find не знает, как выполнить перенаправление, поэтому вы должны явно попросить его запустить оболочку для анализа заданной вами команды. Примерно так:

find -name "an_*" -execdir sh -c "./run < {}" \;
23
09.05.2018, 00:07
3 ответа

Возможно, ответ такой же, как и в этом вопросе с подвохом:
Как спуститься со слона? Нет. Вы получаете от гуся.

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

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

14
27.01.2020, 19:42

Я сделал это. Это было в системе UNIX, работающей на PDP-11 где-то в 1980 году. Я создал файл под названием «WhatXNow?». Затем я использовал «редактор» двоичных файлов, чтобы отредактировать дисковое устройство и изменить «X» на «/» в индексном дескрипторе (при отключенной файловой системе).

Пострадавший так и не понял, как его удалить.

Редактировать: упс, Бармар прав, я не заметил там строчки о том, что устройство не устанавливается. И да, это был каталог, который я редактировал, а не индексный дескриптор. Это было давно: -)

5
27.01.2020, 19:42

Любой сценарий, в котором/(точнее, байт, а не символ, со значением 0x2f; почти все ядра Unix преднамеренно не обращают внимания на кодировку символов )находит путь в запись каталога, без ручного манипулирования необработанными блоками диска, несомненно, является ошибкой в ​​​​ядре.

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

(См. comp.unix FAQ #2.2 , подраздел, начинающийся «Что, если в имени файла есть '/'?», для более длинной версии вышеизложенного.)

1
27.01.2020, 19:42

Теги

Похожие вопросы