Existe outro gancho que, quando usado com cuidado, ajuda a fazer o trabalho. O nome do gancho é DPkg::Pre-Install-Pkgs
e também é uma matriz como Pre-Invoke
. De acordo com man apt.conf
,
This is a list of shell commands to run before invoking dpkg(1). Like options this must be specified in list notation. The commands are invoked in order using /bin/sh; should any fail APT will abort. APT will pass the filenames of all .deb files it is going to install to the commands, one per line on the requested file descriptor, defaulting to standard input.
Especifique um script no gancho como este
DPkg::Pre-Install-Pkgs { "/usr/local/libexec/somepackage-preinstall"; }
O script é invocado sem argumentos e obtém uma lista de nomes de arquivos de pacotes .deb em sua entrada padrão. Agora, é importante que o script seja invocado não apenas para apt-get install
, mas também para apt-get remove
(com entrada vazia). Portanto, no script, você precisa detectar que o pacote que requer algum processamento de pré-instalação está, na verdade, entre os que foram passados para sua entrada padrão. Isso pode ser feito assim
#!/bin/bash
grep -q '/somepackage_' || exit 0
... Do what you need here ...
o grep tenta comparar cada nome de arquivo na entrada padrão com o padrão que deve identificar o pacote exclusivamente, e o script sai com êxito se o apt-get install
ou apt-get upgrade
não foi chamado de forma a atualizar o pacote no qual você está interessado Se você quiser também obter o nome do arquivo .deb, você pode usar, por exemplo, o seguinte bashisa
#!/bin/bash
read debfile < <(grep '/somepackage_') || exit 0
Esse uso garante que a variável $debfile
obtenha exatamente um nome de arquivo de pacote, para evitar surpresas se mais de uma corresponder à entrada.
Lembre-se de que os nomes dos arquivos estão começando na raiz do sistema de arquivos, como /var/cache/apt/archives/acl_2.2.52-1_amd64.deb
.
Como DPkg::Pre-Install-Pkgs
é uma matriz, todas as linhas que a especificam em vários arquivos em apt.conf.d
são cumulativas: cada script será invocado com a mesma entrada.