¿Por qué usar install en lugar de cp y mkdir?


Respuestas:


59

Depende de lo que estés haciendo.

El installcomando se usa normalmente en scripts de instalación que vienen con paquetes y código fuente para instalar un binario en su sistema. También se puede usar para instalar cualquier otro archivo o directorio. Además de las -dy -copciones que tiene -mpara la especificación de los nuevos permisos del archivo a instalar, por lo que no tiene que hacer una cpy una chmodpara conseguir el mismo resultado. Por ejemplo:

install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"

También tiene opciones -gy -opara configurar el grupo objetivo y el propietario, respectivamente. Esto evita llamadas separadas a chown. En general, el uso installacorta su script y lo hace más conciso al crear, copiar, configurar el modo y otras cosas relacionadas con un solo comando en lugar de muchos.

Para referencia, ver man install. Para su uso, solo eche un vistazo a cualquier script de instalación enviado con algún código fuente del paquete .


22

"instalar" generalmente combina las siguientes acciones:

  • Copia del archivo especificado en el lugar de destino, que se realiza con respecto a los procesos que utilizan una copia anterior. A diferencia de "cp", "instalar" ya sea desvincula el archivo antes de la creación de uno nuevo o (en sistemas BSD, con el interruptor -S) crea uno nuevo y renombra atómicamente el nombre del objetivo, lo que evita la condición de carrera entre la instalación y la reapertura . Si no se usa esto, la copia podría fallar (con ETXTBSY) para un archivo binario en ejecución, o causar un bloqueo si se reemplaza un archivo de biblioteca o uno de datos.
  • Establezca las credenciales adecuadas para el nuevo archivo sin necesidad de comandos separados.
  • Haga directorios intermedios, si así lo solicita.
  • Evite modificar un archivo de destino si es idéntico a la nueva versión (-C switch).

Por lo tanto, se sigue el enfoque de Unix de que se debe crear una herramienta para una acción única pero completa de instalar un archivo creado por una herramienta de construcción en su ubicación de trabajo.

El concepto completo, como he descrito, se implementa en sistemas BSD (en la llamada versión "xinstall"); Trato aquí el modo "copia segura" (nueva versión con cambio de nombre atómico) como vital para esto. Los sistemas Linux (de coreutils) pierden esta parte importante y son propensos a las carreras entre la eliminación y la reapertura por un proceso de espectador; pero esto podría haber sido cubierto por los administradores de paquetes.


2
El uso de installo $(INSTALL)en archivos MAKE también marca esos pasos como pasos de copia de instalación y no como pasos de copia normales. Eso podría ser útil.
Kaz

Me encuentro con la carrera en la instalación de Coreutils ... ¿Hay alguna solución o una alternativa que lo haga correctamente?
trent

@trentw ¿qué tipo de carrera?
Netch

8

Además de las descripciones anteriores aquí sobre el uso, hay una diferencia de bajo nivel entre cpy install, al menos en Linux. Si copia sobre un archivo existente, cpsobrescribe el inodo existente del archivo, mientras que installsiempre crea un nuevo inodo para el mismo nombre de archivo.

Esto hace la diferencia al instalar una nueva versión de un binario en ejecución. El uso cpprovoca un error EBUSY, mientras que installtendrá éxito. El binario en ejecución seguirá usando la versión anterior, pero la nueva versión se usa si se reinicia el programa.


Eso es interesante ... ¿Entonces puede crear un archivo con el mismo nombre pero con un inodo diferente?
Neaţu Ovidiu Gabriel

1
@ NeaţuOvidiuGabriel Sí. Para el usuario, solo habrá un archivo, ya que los archivos generalmente se buscan por nombre. Pero para el sistema de archivos, hay dos archivos siempre que algún proceso contenga una referencia al archivo anterior. Se puede lograr lo mismo si cambia el nombre o elimina un archivo que se abre mediante un proceso, y luego crea un nuevo archivo con el mismo nombre.
Tomas Skäre

4

Si el directorio en cuestión ya existe:

  • mkdir -p intentará establecer los bits de propiedad y modo de archivo
  • install -d no intentará establecer los bits de propiedad y modo de archivo

Esto es para mkdiry installdesde GNU coreutils . Ambos usan la misma make_dir_parentsfunción, pero con el preserve_existingparámetro se establece en falseo true, respectivamente.


1
Útil diferenciación!
Victor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.