Необходимо прояснить несколько моментов:
cp
- это отдельная утилита от bash
. Некоторых могут сбить с толку встроенные команды, такие как cd
и pwd
, которые либо являются, либо могут быть частью оболочки POSIX. bash
- одна из нескольких оболочек, реализующих функции, описанные в POSIX. Большинство оболочек имеют некоторые отличия от оболочки POSIX sh
; имя, под которым запускается оболочка, является функцией, описанной в POSIX. Термин «встроенные» подразумевает, что оболочка может выполнять утилиту напрямую и не нуждается в ее поиске. Реализация может сделать любую утилитой встроенной; однако описанные здесь специальные встроенные утилиты отличаются от обычных встроенных утилит в двух отношениях:
Таким образом, в принципе cp
может быть частью bash
, если его разработчики выбрали именно это.На практике этого не происходит, потому что нет смысла дополнительно усложнять bash
путем добавления функций, которые могут быть выполнены хорошо отдельно от bash
.
Далее, ссылка, упомянутая в вопросе, основана на POSIX, но не является документом POSIX. Вы можете увидеть отказ от ответственности в конце:
Части этого текста перепечатаны и воспроизведены ...
и
Любые типографские ошибки или ошибки форматирования, появляющиеся на этой странице, скорее всего, будут иметь {{ 1}} был введен во время преобразования исходных файлов в формат страницы руководства.
Но большая часть справочной страницы дословно скопирована из POSIX. Документы POSIX написаны в квазизаконном стиле, пытаясь избежать подробного описания вещей, когда их авторы знают, что существующие реализации различаются, а также избегают деталей, когда они считают, что внутренние детали реализации могут отличаться. Таким образом, вы получаете пошаговое описание действий, которые предпринимают программы, и (часто) опускание деталей, которые другие авторы добавляли бы, чтобы объяснить, как связаны различные шаги. В некоторых документах POSIX есть раздел для ОБОСНОВАНИЕ , но даже таких, похоже, меньшинство. Результат часто бывает расплывчатым, но вы должны сделать скидку на цель: описание общих черт существующих программ.
Это конкретная часть вопроса, которая указывает на путаницу:
Учитывая определение posix, я ожидаю, что cp -R srcDir existingDestDir приведет к содержанию srcDir для копирования в существующийDestDir . Вместо этого srcDir копируется в existingDestDir как в реализациях sh, так и в bash и csh.
Суть документации заключается в том, что каталоги в источнике также обрабатываются с использованием того же итеративного и рекурсивного описания, что и обычные файлы. Одно из правил изложено в разделе Сводка :
cp -R [-H | -L | -P] [-fip] source_file ... target
, что является третьим примером , и единственный, в котором упоминается опция -R
. Об этом говорится позже, в Описание :
Третья форма синопсиса обозначается двумя или более операндами, где указана опция -R. Утилита
cp
должна скопировать каждый файл в файловой иерархии с корнем в каждом исходном_файле в путь назначения, названный следующим образом:
Если цель существует и именует существующий каталог , имя соответствующего пути назначения для каждого файла в файловой иерархии должно быть конкатенацией target , одного символа
, если target не заканчивался на
, а путь к файлу относился к каталогу, содержащему исходный_файл .
Если цель не существует и указаны два операнда, имя соответствующего пути назначения для исходный_файл должно быть target ; имя соответствующего пути назначения для всех других файлов в файловой иерархии должно быть конкатенацией target , символа
и пути к файлу относительно исходный_файл .
То есть имя вашего каталога рассматривается как «файл» в первом маркированном элементе и объединяется с именем целевого каталога.
Дополнительная литература:
На странице руководства GNU coreutils отсутствуют подробности. Вы можете увидеть некоторые особенности документа POSIX на странице руководства Solaris, которая, кстати, более четко написана:
/ usr / bin / cp -r | -R [-H | -L | -P] [-fip @] source_dir ... target
и
В третьей форме синопсиса один или несколько каталогов, указанных в source_dir , копируются в каталог, указанный target. Необходимо указать
-r
или-R
. Для каждого source_dir ,cp
копирует все файлы и подкаталоги.