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 policy
salida presumiblemente :-)
UPD :
foo
utilizado 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 +50
otorgará una recompensa adicional a cualquiera que explique por qué la 2>&1
solució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/status
strace apt-cache policy foo 2>&1
y 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
--quiet
se ha especificado ninguna opción,apt-cache
actúa como si la hubiera pasado--quiet=1
. Una solución alternativa es pasarle una--quiet=0
opció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>&1
comando, puede ver la líneaioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
Debido 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 Unable
que requiere la instalación de unscript
dispositivo. Según lo aconsejado - pondré +50 aquí en 2 días (SE no permite hacerlo antes)Una solución "mejor" sería utilizar una
script
utilidad:De esa manera intercepta toda la salida y la reenvía a
stdout
.El único inconveniente es que necesita instalar el
script
si aún no lo tiene. En ubunty se proporciona porbsdutils
paquete.fuente