Una diferencia importante es que cp trunca el archivo de destino y comienza a copiar datos del origen al archivo de destino.
install, por otro lado, elimina primero el archivo de destino.
Esto es significativo porque si el archivo de destino ya está en uso, podrían pasarle cosas malas a quien esté usando ese archivo en caso de que cp
un nuevo archivo encima de él. p.ej. sobrescribir un ejecutable que se está ejecutando puede fallar. Truncar un archivo de datos en el que un proceso existente está ocupado leyendo/escribiendo podría causar un comportamiento bastante extraño. Si simplemente elimina el archivo de destino primero, como lo hace la instalación, las cosas continúan como de costumbre:el archivo eliminado no se elimina hasta que todos los procesos cierran ese archivo.
Técnicamente, la diferencia entre install -c
y cp
es que install
establece los permisos del archivo de destino en rwxr-xr-x
. cp
conserva los permisos del archivo fuente menos el umask. Estos comportamientos predeterminados son útiles en diferentes situaciones. Obviamente, con todas las opciones que tanto cp
y install
oferta hoy en día, las funcionalidades han convergido.
Hoy en día, install
se usa comúnmente en makefiles, cp
en todos lados. Esta distinción es ocasionalmente útil porque algunos sistemas operativos o sistemas de instalación le permiten conectarse al install
programa para registrar los paquetes instalados. Los sistemas modernos de gestión de paquetes hacen que este tipo de datos quede obsoleto, pero algunas personas aún lo usan. Además, la posibilidad de configurar los permisos del archivo de destino al mismo tiempo es muy conveniente.
El install
utilidad, en su base, es un elegante cp
. Pero como herramienta específica para realizar instalaciones, contiene algunas características que cp
no. Mi /usr/bin/install
de GNU coreutils no solo copia, sino que también puede cambiar permisos/propiedad como banderas arg (guardando chgrp
, chown
, chmod
invocaciones) una opción para eliminar la información de depuración (guardando un strip
invocación) y también algo de mojo para contextos SELinux.
Simplemente proporciona acciones de conveniencia útiles para las instalaciones de software. Ninguno cambia la vida, todos son útiles y hacen que sus scripts sean más limpios.