Perché usare install anziché cp e mkdir?


Risposte:


59

Dipende da cosa stai facendo.

Il installcomando viene normalmente utilizzato negli script di installazione forniti con pacchetti e codice sorgente per l'installazione di un file binario sul sistema. Può anche essere usato per installare qualsiasi altro file o directory. Oltre alle opzioni -de -cche hai -mper specificare le nuove autorizzazioni del file da installare, quindi non devi fare a cpe a chmodper ottenere lo stesso risultato. Per esempio:

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

Hai anche opzioni -ge -oper impostare rispettivamente il gruppo target e il proprietario. Questo evita chiamate separate a chown. In generale, l'uso installaccorcia lo script e lo rende più conciso eseguendo la creazione di file, la copia, l'impostazione della modalità e le cose correlate in un comando anziché in molti.

Per riferimento, vedere man install. Per l'utilizzo, basta dare un'occhiata a qualsiasi script di installazione fornito con un codice sorgente del pacchetto .


22

"installa" generalmente combina le seguenti azioni:

  • Copia del file specificato nella posizione di destinazione, che viene eseguita rispetto ai processi che utilizzano una vecchia copia. A differenza di "cp", "installa" scollega il file prima della creazione di uno nuovo o (nei sistemi BSD, con l'opzione -S) ne crea uno nuovo e rinomina atomicamente il nome di destinazione, evitando condizioni di competizione tra l'installazione e la riapertura . In caso contrario, la copia potrebbe non riuscire (con ETXTBSY) per un file binario in esecuzione o causare un arresto anomalo se un file di libreria o uno di dati viene sostituito.
  • Impostare le credenziali appropriate per il nuovo file senza la necessità di comandi separati.
  • Crea directory intermedie, se richiesto.
  • Evitare la modifica di un file di destinazione se è identico alla nuova versione (opzione -C).

Quindi, segue l'approccio Unix che uno strumento deve essere creato per una singola ma completa azione di installazione di un file creato da uno strumento di costruzione nella sua posizione di lavoro.

Il concetto completo, come ho descritto, è implementato nei sistemi BSD (nella cosiddetta versione "xinstall"); Tratto qui la modalità "copia sicura" (nuova versione con ridenominazione atomica) come vitale per questo. I sistemi Linux (dai coreutils) mancano di questa parte importante e sono inclini a gareggiare tra l'eliminazione e la riapertura da parte di un processo di spettatori; ma questo avrebbe potuto essere coperto dai gestori di pacchetti.


2
L'uso di installo $(INSTALL)nei makefile contrassegna anche quei passaggi come passaggi di copia dell'installazione e non come normali passaggi di copia. Questo potrebbe essere utile.
Kaz,

Sto incontrando la gara nell'installazione di coreutils ... c'è una correzione o un'alternativa che lo fa correttamente?
Trento,

@trentw che tipo di razza?
Netch

8

Oltre alle descrizioni precedenti qui sull'uso, c'è una differenza di basso livello tra cpe install, almeno su Linux. Se si esegue la copia su un file esistente, cpsovrascrive l'inode esistente del file, installcreando sempre un nuovo inode per lo stesso nome file.

Questo fa la differenza quando si installa una nuova versione di un binario in esecuzione. L'uso cpcausa un errore EBUSY, mentre installriuscirà. Il binario in esecuzione utilizzerà comunque la versione precedente, ma la nuova versione viene utilizzata se il programma viene riavviato.


È interessante ... Quindi può creare un file con lo stesso nome ma inode diverso?
Neaţu Ovidiu Gabriel,

1
@ NeaţuOvidiuGabriel Sì. Per l'utente, ci sarà un solo file, poiché i file vengono generalmente cercati per nome. Ma per il file system, ci sono due file purché alcuni processi contengano un riferimento al vecchio file. Lo stesso si può ottenere se si rinomina o si elimina un file che viene aperto da un processo e quindi si crea un nuovo file con lo stesso nome.
Tomas Skäre,

4

Se la directory in questione esiste già:

  • mkdir -p proverà a impostare i bit di proprietà e modalità file
  • install -d non tenterà di impostare i bit di proprietà e modalità file

Questo è per mkdire installda coreutils GNU . Entrambi usano la stessa make_dir_parentsfunzione, ma con il preserve_existingparametro è impostato su falseo true, rispettivamente.


1
Differenziazione utile!
Victor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.