búsqueda de aptitudes? estrecho vs? y

¿Cuál es la diferencia entre el ?narrow y ?and opciones de búsqueda de aptitud? Por ejemplo, ¿por qué la aptitude search "?and(?installed,?origin(backports))" devuelve resultados en mi sistema, pero la aptitude search "?narrow(?installed,?origin(backports))" ¿no devuelve nada?

Tenga en count que la ejecución apt-cache policy en los packages devueltos por el ?and versión muestra que las versiones instaladas no son de backports, por lo que el resultado ?narrow es el correcto. Pero me he topado con resultados poco intuitivos antes de que se hayan resuelto usando ?narrow después de googlear, pero nunca entendí por qué.

Tiene que ver con la diferencia entre la coincidencia con la versión instalada de un package y la coincidencia con cualquier versión de un package. De la documentation :

Existe una distinción sutil, pero importante, entre emparejar un patrón con un package y compararlo con todas las versiones de ese package. Cuando un patrón se compara con un package, cada uno de sus términos se compara con el package, por lo que cada término coincidirá si coincide con alguna versión del package. Por el contrario, cuando se compara un patrón con cada versión de un package, coincidirá con éxito si coincide cuando todos sus términos coinciden con la misma versión del package.

Por ejemplo: supongamos que la versión 3.0-1 del package aardvark está instalada, pero que la versión 4.0-1 está disponible. Entonces, la expresión de búsqueda ?version(4\.0-1)?installed coincide con aardvark, porque ?version(4\.0-1) coincide con la versión 4.0-1 de aardvark, mientras que las coincidencias ?installed con la versión 3.0-1 . Por otro lado, esta expresión no coincide con todas las versiones de aardvark , porque no hay una sola versión instalada y también tiene un número de versión de 4.0-1 .

La documentation para ?and lee:

?and(pattern1, pattern2), pattern1 pattern2

Coincide con packages que coinciden con pattern1 y pattern2 .

Tenga en count que esto coincide con los packages , no con las versiones de packages . Entonces esta consulta:

 aptitude search '?and(?installed, ?origin(backports))' 

searchá la intersección de los packages que están instalados y los packages con un origen que coincida con los backports expresiones regulares. De hecho, es el mismo resultado que esta consulta:

 aptitude search '?installed?origin(backports)' 

La documentation para ?narrow lecturas ?narrow :

?narrow(filter, pattern), ~S filter pattern

Este término "networkinguce" la búsqueda al filter correspondiente de las versiones del package. En particular, coincide con cualquier versión de package que coincida con el filter y el patrón . El valor de cadena de la coincidencia es el valor de cadena del patrón .

Tenga en count que esto funciona en versiones , no en packages. Por eso, esta consulta solo muestra packages que están instalados con una versión que coincide con los backports :

 aptitude search '?narrow(?installed, ?origin(backports))' 

Esto también está documentado en ?any-version :

?any-version(pattern)

Coincide con un package si cualquiera de sus versiones coincide con el patrón adjunto.

Nota: Este término está estrechamente relacionado con ?narrow . De hecho ?any-version(pattern1 pattern2) es exactamente lo mismo que ?narrow(pattern1, pattern2) .

Nota: para ser precisos, como con cualquier otro patrón, no son packages sino versiones de los packages que coinciden. Para la aptitude search y otros usos, no hace mucha diferencia, pero las aptitude versions solo mostrarán las versiones que coinciden, no todas las versiones del package para las que coincida alguna versión.

Por lo tanto, todas estas consultas dan el mismo resultado:

 aptitude versions '?and(?installed, ?origin(backports))' aptitude versions '?installed?origin(backports)' aptitude versions '?narrow(?installed, ?origin(backports))' 

Si encuentra que el lenguaje de consulta de aptitude confunde (como yo lo hago), puede preferir utilizar un enfoque diferente, como las vinculaciones de Python a libapt . Funciona así:

 import apt apt_cache = apt.Cache() for pkg in apt_cache: if pkg.is_installed: for pkg_origin in pkg.installed.origins: if pkg_origin.origin == 'Debian Backports': print(pkg.name)