¿Cómo puedo ejecutar un comando antes de que apt-get comience a descargar un paquete?
Sé sobre el gancho previo a la invocación dpkg ( engancha un script a apt-get ), pero parece que se ejecuta después de la descarga.
$ apt-get update
Get: 11 http://security.debian.org/ wheezy/updates/main qemu amd64 1.1.2+dfsg-6a+deb7u7 [115 kB]
Fetched 70.9 MB in 10s (6,776 kB/s)
refreshing freenet index
--2015-05-19 15:55:25-- http://127.0.0.1:8888/freenet:USK@oRy7ltZLJM-w-kcOBdiZS1pAA8P-BxZ3BPiiqkmfk0E,6a1KFG6S-Bwp6E-MplW52iH~Y3La6GigQVQDeMjI6rg,AQACAAE/deb.mempo.org/-42/
Lo que necesitamos es ejecutar un comando antes de la descarga. Más exactamente: el script debe ejecutarse después de llamar a apt-get pero antes de que apt-get acceda a cualquier recurso en línea.
¿Hay algo como un gancho de descarga previa?
Es importante que la instalación se pueda realizar sin tener que reemplazar el script apt-get (y sin hacer nada más que una actualización pueda deshacer).
apt-get
que en sí misma llamaría realapt-get
. Dependiendo del alcance que desee que tenga, la función podría declararse en/etc/profile
o~/.profile
o~/.bashrc
.Respuestas:
¿Qué pasa con el uso de ganchos apt pre / post-invoke?
Esencialmente es similar a los ganchos dpkg pre / post-invoke pero para apt (lo que supongo que es realmente el importante en su escenario de uso). AFAIK hay otros, pero solo los he usado así.
P.ej
fuente
apt-get update
.Primero determine dónde está apt-get usando
whereis apt-get
owhich apt-get
; Asumiré que está en / usr / bin / apt-getLuego cree un archivo en / usr / local / bin / apt-get con este contenido:
ahora
chmod +x /usr/local/bin/apt-get
.Esto debería sobrevivir a todas las actualizaciones de la distribución, pero no debería cambiar el comportamiento de apt-get (aparte de ejecutar el comando antes de hacer cualquier otra cosa). Como beneficio adicional, podría analizar los argumentos de la línea de comando para ejecutar solo el comando cuando realmente se necesita.
(Esta respuesta se basa en la respuesta de Mohammad Etemaddar , combinada con los comentarios de muru)
fuente
Puede usar un "alias" en el archivo .bashrc. Por ejemplo, ponga eso en su archivo raíz .bashrc:
Los argumentos de la línea de comandos se agregarán automáticamente al final del alias.
Simplemente reemplácelo
echo blahblah
por el comando que necesita.Pero en este caso, solo funciona cuando ejecuta comandos como root (no sudo).
fuente
alias apt-get='echo blahblah && sudo apt-get'
. Luego, solo necesita escribir el terminal, por ejemplo,apt-get update
sinsudo
, y se le pedirá una contraseña de sudo automáticamente./usr/local/bin
o~/bin
), porque los alias no manejan bien los argumentos.Primero determine dónde está usando apt-get
whereis apt-get
; Asumiré que está en / usr / bin / apt-getcomo Muru dice: Se puede crear un script llamado
apt-get
en/usr/local/bin/
el que está delante/usr/bin
en Debian y Ubuntu$PATH
. Luego pon el siguiente código (/usr/local/bin/apt-get
):Gracias muru por la oferta como comentario.
Otra manera:
Por supuesto, hay otra forma que no es mejor que la anterior.
Usted puede
mv /usr/bin/apt-get /usr/bin/apt-get2
Luego cree un archivo en / usr / bin / apt-get con este contenido:
ahora
chmod +x /usr/bin/apt-get
fuente
$@
hace que el script funcione con todos los argumentos./usr/local/bin
, que viene antes/usr/bin
en la RUTA predeterminada en Debian y Ubuntu.apt-get
ejecutable se encuentra en/usr/bin/apt-get
, nosbin
. (b) No te metas con los comandos del sistema. Como dice muru, puede crear una anulación local/usr/local/bin
, aunque incluso eso no es una buena solución.Pruebe con un alias en el
.bashrc
archivo. Solo funciona cuando inicia sesión en la cuenta a la que corresponde el archivo. La sintaxis de un alias es:alias newcommand='command1; command2; command3'
Entonces su línea podría verse un poco así:alias apt-get='firstcommand; apt-get'
O esto:
alias apt-get='firstcommand && apt-get'
Con el segundo,
apt-get
solo se ejecutará sifirstcommand
tiene éxito.fuente