Existem vários pontos a esclarecer:
-
cp
é um utilitário separado de bash
. Algumas pessoas podem ficar confusas com comandos internos, como cd
e < strong> pwd
que são ou podem ser parte de um shell POSIX.
- POSIX refere-se à série de documentos mantida em conjunto pelo The Open Group e o IEEE, conhecido como IEEE Std 1003.1 ™ .
-
bash
é um dos vários shells que implementam os recursos descritos em POSIX. A maioria dos shells tem algumas diferenças do shell POSIX sh
; o nome pelo qual o shell é executado é um recurso descrito em POSIX.
- na seção 2.14. Utilitários Internos Especiais , POSIX diz
The term "built-in" implies that the shell can execute the utility directly and does not need to search for it. An implementation may choose to make any utility a built-in; however, the special built-in utilities described here differ from regular built-in utilities in two respects:
Então, em princípio, cp
poderia fazer parte de bash
se seus desenvolvedores tivessem escolhido fazer isso. Na prática, isso não é feito porque não faz sentido complicar bash
adicionando recursos que podem ser feitos bem separadamente em bash
.
Em seguida, o link mencionado na questão é baseado no POSIX, mas não é o documento POSIX. Você pode ver as isenções de responsabilidade no final:
Portions of this text are reprinted and reproduced ...
e
Any typographical or formatting errors that appear in this page are most likely to have
been introduced during the conversion of the source files to man page format.
Mas a maior parte da página de manual é copiada palavra por palavra do POSIX. Os documentos POSIX são escritos em um estilo quase legalista, tentando evitar descrever detalhadamente as coisas onde seus autores estão cientes de que as implementações existentes diferem, bem como evitar detalhes onde eles acreditam que os detalhes internos da implementação podem ser diferentes. Então, o que você obtém é uma descrição passo a passo das ações que os programas executam, e (frequentemente) omitindo detalhes que outros autores adicionariam para explicar como as diferentes etapas estão relacionadas. Alguns dos documentos POSIX fornecem uma seção para RATIONALE , mas mesmo esses parecem ser uma minoria. O resultado é muitas vezes vago, mas você tem que fazer concessões para a intenção: descrever características comuns de programas existentes.
Esta é a parte específica da pergunta que indica confusão:
Given the posix definition, I would expect cp -R srcDir existingDestDir to result in the contents of srcDir to be copied into the existingDestDir. Instead srcDir gets copied into existingDestDir both in bash and csh implementations of sh.
O ponto da documentação é que diretórios na fonte também são manipulados usando a mesma descrição iterativa e recursiva que os arquivos comuns . Uma das regras é descrita na seção Sinopse :
cp -R [-H|-L|-P] [-fip] source_file... target
qual é o terceiro exemplo e o único que menciona a opção -R
. Isto é referido mais tarde, na Descrição :
The third synopsis form is denoted by two or more operands where the -R option is specified. The cp
utility shall copy each file in the file hierarchy rooted in each source_file to a destination path named as follows:
If target exists and names an existing directory, the name of the corresponding destination path for each file in the file hierarchy shall be the concatenation of target, a single <slash>
character if target did not end in a <slash>
, and the pathname of the file relative to the directory containing source_file.
If target does not exist and two operands are specified, the name of the corresponding destination path for source_file shall be target; the name of the corresponding destination path for all other files in the file hierarchy shall be the concatenation of target, a <slash>
character, and the pathname of the file relative to source_file.
Ou seja, o nome do seu diretório é tratado como um "arquivo" no primeiro item com marcadores e é concatenado com o nome do diretório de destino.
Leitura adicional:
A página de manual do GNU coreutils não possui detalhes. Você pode ver um pouco do sabor do documento POSIX na página de manual do Solaris, que por sinal é mais claramente escrito:
/usr/bin/cp -r | -R [-H | -L | -P] [-fip@] source_dir... target
e
In the third synopsis form, one or more directories specified by source_dir are copied to the directory specified by target. Either -r
or -R
must be specified. For each source_dir, cp
copies all files and subdirectories.