Por que usar instalar em vez de cp e mkdir?

58

Eu vi em muitos lugares usados install -d para criar diretórios e install -c para copiar um arquivo. Por que não usar mkdir e cp ? Existe uma vantagem em usar install ?

    
por Neaţu Ovidiu Gabriel 13.12.2013 / 10:00

4 respostas

49

Depende do que você está fazendo.

O comando install é normalmente usado em scripts de instalação que vêm com pacotes e código-fonte para instalar um binário em seu sistema. Também pode ser usado para instalar qualquer outro arquivo ou diretório. Além das opções -d e -c você tem -m para especificar as novas permissões do arquivo a ser instalado, assim você não precisa fazer cp e chmod para obter o mesmo resultado. Por exemplo:

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

Você também tem as opções -g e -o para definir o grupo-alvo e o proprietário, respectivamente. Isso evita chamadas separadas para chown . Em geral, usar install encurta seu script e o torna mais conciso ao criar arquivos, copiar, definir modos e coisas relacionadas em um comando, em vez de muitos.

Para referência, consulte man install . Para uso, basta dar uma olhada em qualquer script de instalação enviado com algum código-fonte do pacote.

    
por 13.12.2013 / 11:08
18

"instalar" geralmente combina as seguintes ações:

  • Cópia do arquivo especificado para o local de destino, o que está sendo feito com relação aos processos que usam uma cópia antiga. Ao contrário de "cp", "install" desassocia o arquivo antes da criação de um novo, ou (em sistemas BSD, com switch -S) cria um novo nome e renomeia para o nome do destino atomicamente, o que evita a condição de corrida entre instalação e reabertura . Se não for usar isso, a cópia poderá falhar (com ETXTBSY) para um arquivo binário em execução ou causar uma falha se um arquivo de biblioteca ou um de dados for substituído.
  • Defina as credenciais adequadas para o novo arquivo sem a necessidade de comandos separados.
  • Crie diretórios intermediários, se solicitado.
  • Evite modificar um arquivo de destino se ele for idêntico à nova versão (switch -C).

Portanto, segue-se a abordagem Unix de que uma ferramenta deve ser feita para uma ação única, mas completa, de instalação de um arquivo feito por uma ferramenta de construção em seu local de trabalho.

O conceito completo, como descrevi, é implementado em sistemas BSD (na chamada versão "xinstall"); Trato aqui o modo "cópia segura" (nova versão com renomeação atômica) como vital para isso. Os sistemas Linux (do coreutils) perdem essa parte importante e são propensos a disputas entre a exclusão e a reabertura por um processo de espectador; mas isso poderia ter sido coberto por gerenciadores de pacotes.

    
por 18.12.2013 / 12:09
4

Além das descrições anteriores sobre o uso, há uma diferença de baixo nível entre cp e install , pelo menos no Linux. Se copiar sobre um arquivo existente, cp sobrescreve o inode existente do arquivo, enquanto install sempre cria um novo inode para o mesmo nome de arquivo.

Isso faz diferença ao instalar uma nova versão de um binário em execução. Usar cp causa um erro EBUSY, enquanto install será bem-sucedido. O binário em execução ainda usará a versão antiga, mas a nova versão será usada se o programa for reiniciado.

    
por 02.05.2018 / 10:19
3

Se o diretório em questão já existir:

  • mkdir -p tentará definir a propriedade e os bits do modo de arquivo
  • install -d não tentará definir os bits de propriedade e de modo de arquivo

Isso é para mkdir e install de GNU coreutils . Ambos usam a mesma função make_dir_parents , mas com o parâmetro preserve_existing sendo definido como false ou true , respectivamente.

    
por 26.01.2017 / 16:11