Por que usar install em vez de cp e mkdir?

68

Eu já vi em muitos lugares usados install -dpara criar diretórios e install -ccopiar um arquivo. Por que não usar mkdire cp? Existe uma vantagem em usar install?

Neaţu Ovidiu Gabriel
fonte

Respostas:

59

Depende do que você está fazendo.

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

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

Você também tem opções -ge -opara definir o grupo-alvo e o proprietário, respectivamente. Isso evita chamadas separadas para chown. Em geral, o uso installreduz o seu script e o torna mais conciso, criando criação de arquivo, cópia, configuração de modo e itens relacionados 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 .


fonte
22

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

  • Cópia do arquivo especificado no local de destino, o que está sendo feito com relação aos processos que usam uma cópia antiga. Diferente de "cp", "install" desassocia o arquivo antes da criação de um novo ou (em sistemas BSD, com a opção -S) cria um novo e renomeia o nome do destino atomicamente, o que evita a condição de corrida entre a instalação e a reabertura . Caso contrário, 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 dado for substituído.
  • Defina credenciais apropriadas para o novo arquivo sem a necessidade de comandos separados.
  • Crie diretórios intermediários, se solicitado.
  • Evite modificar um arquivo de destino se for idêntico à nova versão (opção -C).

Portanto, segue a abordagem do Unix que uma ferramenta deve ser feita para uma ação única, mas completa, de instalar um arquivo criado por alguma ferramenta de construção em seu local de trabalho.

O conceito completo, como descrevi, é implementado nos 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 excluir e reabrir por um processo de espectador; mas isso poderia ter sido coberto pelos gerenciadores de pacotes.

Netch
fonte
2
O uso de installou $(INSTALL)em makefiles também sinaliza essas etapas como etapas de cópia de instalação e não como etapas comuns de cópia. Isso pode ser útil.
Kaz
Estou encontrando a corrida na instalação do coreutils ... existe uma correção ou alternativa que faça isso corretamente?
trent
@trentw que tipo de corrida?
Netch 17/08/19
8

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

Isso faz a diferença ao instalar uma nova versão de um binário em execução. O uso cpcausa um erro EBUSY, enquanto installterá êxito. O binário em execução ainda usará a versão antiga, mas a nova versão será usada se o programa for reiniciado.

Tomas Skäre
fonte
Isso é interessante ... Para criar um arquivo com o mesmo nome, mas com inode diferente?
Neaţu Ovidiu Gabriel
11
@ NeaţuOvidiuGabriel Sim. Para o usuário, haverá apenas um arquivo, pois os arquivos geralmente são procurados pelo nome. Mas para o sistema de arquivos, existem dois arquivos, desde que algum processo contenha uma referência ao arquivo antigo. O mesmo pode ser alcançado se você renomear ou excluir um arquivo aberto por um processo e, em seguida, criar um novo arquivo com o mesmo nome.
Tomas Skäre
4

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

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

Isto é para mkdire installdo GNU coreutils . Ambos usam a mesma make_dir_parentsfunção, mas com o preserve_existingparâmetro está sendo definido como falseou true, respectivamente.

Alexander
fonte
11
Diferenciação útil!
213 Victor Victor