Warum wird die Ausgabe der apt-cache-Richtlinie nicht weitergeleitet?

12

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 policyAusgabe vermutlich verarbeiten :-)

UPD :

fooDer in meinem Beispiel verwendete Name kann durch einen beliebigen Paketnamen ersetzt werden, der in Ihrem apt-getIndex nicht vorhanden ist.

UPD 2 :

Es gibt eine Antwort mit einer Problemumgehung. Zusätzliche +50Prämie wird an alle vergeben, die erklären, warum die 2>&1Lösung nicht funktioniert.

zerkms
quelle
# 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
PersianGulf
1
@MohsenPahlevanzadeh das ist richtig, jetzt versuchen Sie den genauen Aufruf (Paketname), den ich bereitgestellt habe :-)
zerkms
3
@MohsenPahlevanzadeh also? Es tut mir leid, aber sind Sie sicher, dass Sie die Frage (und den Titel) gelesen haben?
Zerkms
2
@MohsenPahlevanzadeh nicht, es ist nicht gleich (nicht einmal in der Nähe)
zerkms
1
Ich laufe strace apt-cache policy foo 2>&1und es gibt einen Systemaufruf, der ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0meiner Meinung nach wegen dieses Aufrufs 1 (stdout) Probleme hat. Ich meine, es ist nicht mehr auf tty geschrieben
Esref

Antworten:

11

Wenn stdout kein tty ist (dh es ist eine reguläre Datei oder eine Pipe) und wenn keine --quietOption angegeben wurde, apt-cacheverhält es sich so, als hätten Sie es übergeben --quiet=1. Eine Problemumgehung besteht darin, eine --quiet=0Option zu übergeben.

$ apt-cache --quiet=0 policy foo 2>&1 | grep .
N: Unable to locate package foo
Mark Plotnick
quelle
|&golfs 2>&1 |:-)
Ciro Santilli Am
10

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:

apt-cache policy foo 3>&1 1>&2 2>&3 3>&- | grep .
Mr_Mig
quelle
7

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:

// Deal with stdout not being a tty
   if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
      _config->Set("quiet","1");
Esref
quelle
Okay. Wie kann man sie beide einfangen?
Zerkms
1
Ich konnte keinen anderen Weg finden als die Antwort von @ Mr_Mig. (Meins war 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");
Esref
Übrigens wurde ich auch vor ein paar Minuten von jemandem auf den gleichen Punkt in den Quellen hingewiesen :-) Und eine potenziell bessere Lösung, script -c "sudo apt-cache policy foo" | grep Unabledie die Installation eines scriptobwohl erfordert . Wie empfohlen - ich werde hier in 2 Tagen +50 setzen (SE lässt es nicht früher zu)
zerkms
2
@Esref Ihr Kommentar zu "Ich finde, dass im Quellcode apt-cache ..." sollte in der Antwort sein, also fügen Sie ihn dort hinzu. +1. :
Faheem Mitha
Oh Gott, es gibt keine +50 Kopfgeldoption mehr :-(
zerkms
3

Eine "bessere" Lösung wäre die Verwendung eines scriptDienstprogramms:

script -c "apt-cache policy foo" /dev/null | grep .

Auf diese Weise wird die gesamte Ausgabe abgefangen und an die weitergeleitet stdout .

Der einzige Nachteil ist, dass Sie das installieren müssen, scriptwenn Sie es noch nicht haben. In Ubunty wird es durch bsdutilsPaket bereitgestellt .

zerkms
quelle