Почему опция cp, запрещающая перезаписывать файлы, называется --no-clobber?

Почему опция cp, запрещающая перезаписывать файлы, называется --no-clobber?

cp— чрезвычайно популярный инструмент Linux, поддерживаемый командой coreutils из GNU Foundation.

По умолчанию файлы с одинаковыми именами будут перезаписаны. Если пользователь хочет изменить это поведение, он может добавить --no-clobberв свою команду копирования:

   -n, --no-clobber
          do not overwrite an existing file (overrides a previous -i option)

Почему бы не что-то вроде --no-overwrite?

решение1

«Клоббер«в контексте манипуляции данными означает уничтожение данных путем их перезаписи. В контексте файлов в среде Unix это слово использовалось по крайней мере еще в начале 1980-х годов, возможно, и раньше.Cshпришлось set noclobberнастроить >так, чтобы отказаться от перезаписи существующего файла (позже set -o noclobberв ksh93 и других оболочках в стиле sh). КогдаДобавлены GNU coreutils --no-clobber(в 2009 году) они использовали тот же словарь, что и ракушки.

решение2

Потому что это на самом деле стандартный термин. Как объясняется вВикипедия:

В программной инженерии затирание файла или памяти компьютера — это перезапись его содержимого. Файл жаргона определяет затирание как

Переписывать, обычно непреднамеренно: «Я отошел от конца массива и разбил стопку». Сравните mung, scribble, trash и smash the stack.

Как упоминалось на той же странице, bash и другие оболочки также используют этот термин в своих set -o noclobberили эквивалентных. Это просто стандартный термин для такого рода вещей, поэтому это был естественный выбор для разработчиков cp.

решение3

Термин «клобер» хорошо известен в вычислительной технике в целом.

Опция --no-clobber/ была добавлена -n​​только cp14.01.2009 Камилом Дудкой <[email protected]> (зафиксировать на github).

В частности, в проекте GNU он также используется в GCC.для описания ситуации, когда инструкция ЦП или встроенный оператор asm уничтожают содержимое регистра. Так что это не случайный выбор английского слова, и вполне вероятно, что люди, работающие над проектами GNU, написанными на C, по крайней мере, мимоходом знакомы с использованием этого термина из документации GCC или от других разработчиков проектов GNU, использующих его:

  • (clobber x)вФайлы описания внутренних машин GCCкоторые учат GCC, что делает каждая инструкция в ISA. (Аналогичные ограничения для inline-asm)
  • GNU C расширенный ассемблерВстроенные asm()операторы имеют раздел "clobber", чтобы сообщить компилятору, который регистрирует встроенный шаблон asm, на который он наступает. Как этот бесполезный бессмысленный пример x86:
    asm("xor %eax,%eax; mfence" ::: "eax", "memory", "cc");. напримерВопросы и ответыспрашивая о соглашении о вызове функций в этих терминах.
  • Документы GCCдля-fcall-used-regопишите это как сообщение компилятору о том, что данный регистр «затирается» вызовами функций (т.е. изменяет соглашение о вызовах). В отличие от-fcall-saved-regили-ffixed-reg.
  • ССЗ-Wclobberedпредупреждение - «Предупреждать о переменных, которые могут быть изменены longjmp или vfork». (IDK, существовало ли это в 2009 году, но это показывает, что это слово используется для описания подобного рода вещей в различных контекстах, включая имена опций в других программах).

Автор коммита coreutils, который добавил --no-clobber, Камил Дудка, определенно знаком с внутренним устройством GCC: он (позже?)написал плагин GCCдля формальной проверки программ на языке C.

Я не знаю, повлияло ли на его выбор имени внутреннее устройство GCC или оно было взято из существующих вариантов оболочки, таких как set noclobber, или и то, и другое.

Интересный факт: среди первоначальных авторов GNU cpбыл Торьорн Гранлунд, главный авторпроект gmplib(GNU Multi-Precision) и который помог придумать/реализовать мультипликативно-обратную оптимизацию GCC для деления на константу времени компиляции (Статья 1994 года, Переполнение стекаВопросы и ответы).

Связанный контент