POSIX descrição de cp -R

3

Eu fiquei realmente confuso com a implementação do comando cp -R do bash comparado a como palavras POSIX que deveriam acontecer

Dada a definição de posix, esperaria que cp -R srcDir existingDestDir resultasse no conteúdo de srcDir a ser copiado para o existingDestDir . Em vez disso, srcDir é copiado para existingDestDir nas implementações bash e csh de sh.

A parte relevante da definição do posix cp-R:

For each source_file, the following steps shall be taken:

(...)

2. If source_file is of type directory, the following steps shall be taken:

(...)

f. The files in the directory source_file shall be copied to the directory dest_file, taking the four steps (1 to 4) listed here with the files as source_files.

Eu agradeceria muito se alguém pudesse esclarecer isso para mim.

    
por aaaaaa 25.01.2015 / 04:12

2 respostas

3

Você perdeu um parágrafo mais adiante no documento POSIX:

The third synopsis form (cp -R [-H|-L|-P] [-fip] source_file... target) 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.

No seu caso, com

cp -R srcDir existingDestDir

O "source_file" é srcDir e "target" é existingDestDir . Com o parágrafo, o "caminho de destino para cada arquivo na hierarquia de arquivos" torna-se existingDestDir/srcDir , o que explica o comportamento que você está vendo.

    
por 21.06.2016 / 12:04
2

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.

    
por 21.06.2016 / 11:27

Tags