Kann nicht verstehen warum
$ apt-cache policy foo
N: Unable to locate package foo
aber
$ apt-cache policy foo 2>&1 | grep .
ist leer.
Wo in letzterem Anruf mache ich die falsche Annahme?
Die ursprüngliche Aufgabe: Ich muss die apt-cache policy
Ausgabe vermutlich verarbeiten :-)
UPD :
foo
Der in meinem Beispiel verwendete Name kann durch einen beliebigen Paketnamen ersetzt werden, der in Ihrem apt-get
Index nicht vorhanden ist.
UPD 2 :
Es gibt eine Antwort mit einer Problemumgehung. Zusätzliche +50
Prämie wird an alle vergeben, die erklären, warum die 2>&1
Lösung nicht funktioniert.
# 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
und es gibt einen Systemaufruf, derioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
meiner Meinung nach wegen dieses Aufrufs 1 (stdout) Probleme hat. Ich meine, es ist nicht mehr auf tty geschriebenAntworten:
Wenn stdout kein tty ist (dh es ist eine reguläre Datei oder eine Pipe) und wenn keine
--quiet
Option angegeben wurde,apt-cache
verhält es sich so, als hätten Sie es übergeben--quiet=1
. Eine Problemumgehung besteht darin, eine--quiet=0
Option zu übergeben.quelle
|&
golfs2>&1 |
:-)Es scheint ein betrügerisches Verhalten für Umleitungen in zu geben
apt-cache
. Aber wir können einen Betrüger durch betrügen stdout und stderr tauschen !Probieren Sie dieses aus, es sollte funktionieren:
quelle
Wenn du läufst
strace apt-cache policy foo 2>&1
Befehl , können Sie die Zeile sehenioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
Da dieser Befehl die 1 (stdout) manipuliert, wird 1 nicht mehr in stdout geschrieben. Und wenn Sie 2 zu 1 umleiten, haben Sie beide verloren.
Bearbeiten: Hier ist ein Codebeispiel aus dem Quellcode von apt-cache:
quelle
apt-cache policy foo 1>&2 2>&1 | grep .
) Aber ich finde, dass im Quellcode apt apt-cache :) // Behandle, dass stdout kein tty ist, wenn (! Isatty (STDOUT_FILENO) && _config-> FindI ("quiet", -1) == - 1) _config-> Set ("leise", "1");script -c "sudo apt-cache policy foo" | grep Unable
die die Installation einesscript
obwohl erfordert . Wie empfohlen - ich werde hier in 2 Tagen +50 setzen (SE lässt es nicht früher zu)Eine "bessere" Lösung wäre die Verwendung eines
script
Dienstprogramms:Auf diese Weise wird die gesamte Ausgabe abgefangen und an die weitergeleitet
stdout
.Der einzige Nachteil ist, dass Sie das installieren müssen,
script
wenn Sie es noch nicht haben. In Ubunty wird es durchbsdutils
Paket bereitgestellt .quelle