Je ne comprends pas pourquoi
$ apt-cache policy foo
N: Unable to locate package foo
mais
$ apt-cache policy foo 2>&1 | grep .
est vide.
Où dans ce dernier appel suis-je en train de faire l'hypothèse erronée?
La tâche d'origine: j'ai apt-cache policy
probablement besoin de traiter la sortie :-)
UPD :
foo
utilisé dans mon exemple peut être remplacé par n'importe quel nom de package qui n'existe pas dans votre apt-get
index.
UPD 2 :
il y a une réponse avec une solution de contournement. Une +50
prime supplémentaire sera accordée à toute personne qui explique pourquoi la 2>&1
solution ne fonctionne pas.
# 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
et il y a un appel système,ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
je pense que cet appel 1 (stdout) a des problèmes. Je veux dire qu'il n'est plus écrit sur ttyRéponses:
Si stdout n'est pas un tty (c'est-à-dire un fichier normal ou un canal) et si aucune
--quiet
option n'a été spécifiée,apt-cache
agit comme si vous l'aviez passé--quiet=1
. Une solution de contournement consiste à lui passer une--quiet=0
option.la source
|&
golfs2>&1 |
:-)Il semble y avoir un comportement tricheur pour les redirections dans
apt-cache
. Mais nous pouvons tromper un tricheur en échangeant stdout et stderr !Essayez celui-ci, cela devrait fonctionner:
la source
Si vous exécutez la
strace apt-cache policy foo 2>&1
commande, vous pouvez voir la ligneioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
Parce que cette commande manipule le 1 (stdout), 1 n'est plus écrit sur stdout. Et si vous redirigez 2 vers 1, vous les avez perdus tous les deux.
Edit: Voici un exemple de code à partir du code source apt-cache:
la source
apt-cache policy foo 1>&2 2>&1 | grep .
) Mais je trouve que dans le code source apt apt-cache :) // Traite avec stdout n'étant pas un tty si (! Isatty (STDOUT_FILENO) && _config-> FindI ("quiet", -1) == - 1) _config-> Set ("silencieux", "1");script -c "sudo apt-cache policy foo" | grep Unable
qui nécessite l'installation d'unscript
bien. Comme conseillé - je mettrai +50 ici dans 2 jours (SE ne laisse pas le faire plus tôt)Une "meilleure" solution serait d'utiliser un
script
utilitaire:De cette façon, il intercepte toutes les sorties et les transmet au
stdout
.Le seul inconvénient est que vous devez installer le
script
si vous ne l'avez pas encore. En ubunty, il est fourni parbsdutils
paquet.la source