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
только cp
14.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 года, Переполнение стекаВопросы и ответы).