No puedo entender por qué
$ apt-cache policy foo
N: Unable to locate package foo
pero
$ apt-cache policy foo 2>&1 | grep .
esta vacio.
¿Dónde en la última llamada estoy haciendo la suposición equivocada?
La tarea original: necesito procesar la apt-cache policysalida presumiblemente :-)
UPD :
fooutilizado en mi ejemplo puede ser sustituido por cualquier nombre de paquete que no exista en su apt-getíndice.
UPD 2 :
Hay una respuesta con una solución alternativa. Se +50otorgará una recompensa adicional a cualquiera que explique por qué la 2>&1solución no funciona.

# apt-cache policy vim 2>&1 |grep . vim: Installed: 2:7.4.712-2 Candidate: 2:7.4.712-2 Version table: *** 2:7.4.712-2 0 500 http://ftp.debian.org/debian/ sid/main amd64 Packages 100 /var/lib/dpkg/statusstrace apt-cache policy foo 2>&1y hay una llamada al sistemaioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0, creo que debido a esta llamada 1 (stdout) tiene problemas. Quiero decir que ya no está escrito en ttyRespuestas:
Si stdout no es un tty (es decir, es un archivo normal o una tubería) y si no
--quietse ha especificado ninguna opción,apt-cacheactúa como si la hubiera pasado--quiet=1. Una solución alternativa es pasarle una--quiet=0opción.fuente
|&golfs2>&1 |:-)Parece que hay un comportamiento engañoso para las redirecciones
apt-cache. ¡Pero podemos engañar a un tramposo intercambiando stdout y stderr !Prueba este, debería funcionar:
fuente
Si ejecuta el
strace apt-cache policy foo 2>&1comando, puede ver la líneaioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0Debido a que ese comando manipula el 1 (stdout), 1 ya no se escribe en stdout. Y si redirige 2 a 1, los perdió a ambos.
Editar: Aquí hay un ejemplo de código del código fuente de apt-cache:
fuente
apt-cache policy foo 1>&2 2>&1 | grep .) Pero me parece que en el código fuente apt apt-cache :) // Tratar con stdout no es un tty if (! Isatty (STDOUT_FILENO) && _config-> FindI ("quiet", -1) == - 1) _config-> Set ("quiet", "1");script -c "sudo apt-cache policy foo" | grep Unableque requiere la instalación de unscriptdispositivo. Según lo aconsejado - pondré +50 aquí en 2 días (SE no permite hacerlo antes)Una solución "mejor" sería utilizar una
scriptutilidad:De esa manera intercepta toda la salida y la reenvía a
stdout.El único inconveniente es que necesita instalar el
scriptsi aún no lo tiene. En ubunty se proporciona porbsdutilspaquete.fuente