Descripción POSIX de cp -R

Me confundí mucho con la implementación del command cp -R de bash en comparación con las palabras de POSIX sobre lo que debería suceder

Dada la definición de posix, esperaría que cp -R srcDir existingDestDir como resultado que los contenidos de srcDir se copyran en srcDir existingDestDir . En cambio, srcDir se copy en existingDestDir existente tanto en implementaciones bash como csh de sh.

La parte relevante de la definición posix cp -R:

Para cada file fuente, se deben seguir los siguientes pasos:

(…)

2. Si source_file es de tipo directory, se deben seguir los siguientes pasos:

(…)

F. Los files en el directory file_fuente se copyrán en el directory file_destino, tomando los cuatro pasos (1 a 4) enumerados aquí con los files como files_origen.

Apreciaría mucho si alguien pudiera aclararme esto.

Related of "Descripción POSIX de cp -R"

Te perdiste un párrafo más adelante en el documento POSIX:

La tercera forma de sinopsis ( cp -R [-H|-L|-P] [-fip] source_file... target ) se denota por dos o más operandos donde se especifica la opción -R. La utilidad cp copyrá cada file en la jerarquía de files enraizada en cada file fuente en una ruta de destino con el siguiente nombre:

  • Si el destino existe y nombra un directory existente, el nombre de la ruta de destino correspondiente para cada file en la jerarquía de files será la concatenación de destino, un solo carácter <slash> si el destino no finalizó en una <slash> , y el nombre de ruta del file relativo al directory que contiene el file de origen.

En tu caso, con

 cp -R srcDir existingDestDir 

El "file_origen" es srcDir y "objective" srcDir existingDestDir . Con el párrafo, la "ruta de destino para cada file en la jerarquía de files" pasa a ser existingDestDir/srcDir , lo que explica el comportamiento que está viendo.

Hay varios puntos para aclarar:

  • cp es una utilidad separada de bash . Algunas personas pueden sentirse confundidas por los commands incorporados, como cd y pwd que son o pueden ser parte de un shell POSIX.
  • POSIX se refiere a la serie de documentos mantenidos conjuntamente por The Open Group y el IEEE, conocido como IEEE Std 1003.1 ™ .
  • bash es uno de varios shells que implementan las características descritas en POSIX. La mayoría de las conchas tienen algunas diferencias con el shell sh POSIX; el nombre por el cual se ejecuta el shell es una característica descrita en POSIX.
  • en la sección 2.14. Utilidades especiales incorporadas , dice POSIX

El término "incorporado" implica que el shell puede ejecutar la utilidad directamente y no necesita searchla. Una implementación puede elegir incorporar cualquier utilidad; sin embargo, las utilidades incorporadas especiales descritas aquí difieren de las utilidades integradas regulares en dos aspectos:

Entonces, en principio, cp podría ser parte de bash si sus desarrolladores hubieran elegido hacer eso. En la práctica, esto no se hace porque no tiene sentido complicar aún más bash al agregar características que se pueden hacer bien por separado de bash .

A continuación, el enlace mencionado en la pregunta se basa en POSIX, pero no es el documento POSIX. Puedes ver las renuncias al final:

Algunas partes de este text se reproducen y reproducen …

y

Cualquier error tipográfico o de formatting que aparezca en esta página es más probable que se haya introducido durante la conversión de los files fuente al formatting de página man.

Pero la mayor parte de la página del manual se copy palabra por palabra de POSIX. Los documentos POSIX están escritos en un estilo cuasi legalist, intentando evitar describir detalladamente las cosas cuando sus autores saben que las implementaciones existentes son diferentes, así como también evitan detalles donde creen que los detalles internos de la implementación pueden diferir. Entonces, lo que obtienes es una descripción paso a paso de las acciones que toman los progtwigs y (a menudo) omitiendo detalles que otros autores agregarían para explicar cómo se relacionan los diferentes pasos. Algunos de los documentos POSIX proporcionan una sección para JUSTIFICACIÓN , pero incluso aquellos parecen ser una minoría. El resultado suele ser impreciso, pero debe tener en count la intención: describir las características comunes de los progtwigs existentes.

Esta es la parte específica de la pregunta que indica confusión:

Dada la definición de posix, esperaría que cp -R srcDir existingDestDir tuviera como resultado que los contenidos de srcDir se copyran en elDestDir existente . En cambio, srcDir se copy en existingDestDir existente tanto en implementaciones bash como csh de sh.

El objective de la documentation es que los directorys en el origen también se manejan usando la misma descripción iterativa y recursiva que los files ordinarios . Una de las reglas se describe en la sección de Sinopsis :

cp -R [-H|-L|-P] [-fip] source_file... target

que es el tercer ejemplo, y el único que menciona la opción -R . Esto se menciona más adelante, en la Descripción :

La tercera forma de sinopsis se denota por dos o más operandos donde se especifica la opción -R. La utilidad cp copyrá cada file en la jerarquía de files enraizada en cada file fuente en una ruta de destino con el siguiente nombre:

  • Si el destino existe y nombra un directory existente , el nombre de la ruta de destino correspondiente para cada file en la jerarquía de files será la concatenación de destino , un solo carácter <slash> si el destino no finalizó en una <slash> , y el nombre de ruta del file relativo al directory que contiene el file de origen .

  • Si el objective no existe y se especifican dos operandos, el nombre de la ruta de destino correspondiente para source_file será el objective ; el nombre de la ruta de destino correspondiente para todos los demás files en la jerarquía de files será la concatenación de destino , un carácter <slash> y la ruta de acceso del file en relación con el file fuente .

Es decir, su nombre de directory se trata como un "file" en el primer elemento con viñetas y se concatena con el nombre del directory de destino.

Otras lecturas:

  • cp – copyr files (Solaris)
  • cp – copyr files y directorys (GNU coreutils)

La página de manual de GNU coreutils carece de detalles. Puede ver algo del sabor del documento POSIX en la página del manual de Solaris, que por cierto está escrito más claramente:

/usr/bin/cp -r | -R [-H | -L | -P] [-fip@] source_dir... target

y

En la tercera forma de sinopsis, uno o más directorys especificados por source_dir se copyn en el directory especificado por target. Se debe especificar -r o -R . Para cada dir_origen , cp copy todos los files y subdirectorys.