Perché l'output del criterio apt-cache non viene convogliato?


12

Non riesco a capire perché

$ apt-cache policy foo
N: Unable to locate package foo

ma

$ apt-cache policy foo 2>&1 | grep .

è vuoto.

Dove in quest'ultima chiamata sto facendo l'ipotesi sbagliata?

Il compito originale: devo elaborare l' apt-cache policyoutput presumibilmente :-)

UPD :

foousato nel mio esempio può essere sostituito con qualsiasi nome di pacchetto che non esiste nel tuo apt-getindice.

UPD 2 :

c'è una risposta con una soluzione alternativa. Un +50premio aggiuntivo verrà assegnato a chiunque spieghi perché la 2>&1soluzione non funziona.


# 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
Golfo Persico,

1
@MohsenPahlevanzadeh esatto, ora prova la chiamata esatta (nome del pacchetto) che ho fornito :-)
zerkms,

3
@MohsenPahlevanzadeh così? Mi dispiace, ma sei sicuro di aver letto la domanda (e il titolo)?
zerkms,

2
@MohsenPahlevanzadeh non è uguale (nemmeno vicino)
zerkms,

1
Corro strace apt-cache policy foo 2>&1e c'è una chiamata di sistema ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0che penso a causa di questa chiamata 1 (stdout) abbia problemi. Voglio dire, non è più scritto in tty
Esref,

Risposte:


11

Se stdout non è un tty (ovvero è un file normale o una pipe) e se non --quietè stata specificata alcuna opzione, si apt-cachecomporta come se fosse stata passata --quiet=1. Una soluzione alternativa è passarle --quiet=0un'opzione.

$ apt-cache --quiet=0 policy foo 2>&1 | grep .
N: Unable to locate package foo


10

Sembra esserci un comportamento poco costoso per i reindirizzamenti in apt-cache. Ma possiamo imbrogliare un imbroglione scambiando stdout e stderr !

Prova questo, dovrebbe funzionare:

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

7

Se esegui il strace apt-cache policy foo 2>&1comando, puoi vedere la lineaioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

Poiché quel comando modifica 1 (stdout), 1 non viene più scritto su stdout. E se reindirizzi 2 a 1, li hai persi entrambi.

Modifica: ecco un esempio di codice dal codice sorgente apt-cache:

// Deal with stdout not being a tty
   if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
      _config->Set("quiet","1");

Va bene. Qualche modo per catturarli entrambi?
zerkms,

1
Non sono riuscito a trovare altro modo che la risposta di @ Mr_Mig. (Il mio era apt-cache policy foo 1>&2 2>&1 | grep .) Ma trovo che nel codice sorgente apt-cache :) // Gestire stdout non sia un tty if (! Isatty (STDOUT_FILENO) && _config-> FindI ("quiet", -1) == - 1) _config-> Set ("quiet", "1");
Esref,

A proposito, sono stato anche segnalato da qualcuno allo stesso punto nelle fonti solo pochi minuti fa :-) E una soluzione potenzialmente migliore script -c "sudo apt-cache policy foo" | grep Unableche richiede l'installazione di un scriptpensiero. Come consigliato - Metterò qui +50 tra 2 giorni (SE non lo lascia fare prima)
zerkms

2
@Esref Il tuo commento su "Trovo che nel codice sorgente apt-cache ..." dovrebbe essere nella risposta, quindi per favore aggiungilo lì. +1. :
Faheem Mitha

Oddio, non esiste più un'opzione di ricompensa +50 :-(
zerkms,

3

Una soluzione "migliore" sarebbe quella di utilizzare scriptun'utilità:

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

In questo modo intercetta tutto l'output e lo inoltra a stdout.

L'unico inconveniente è che è necessario installare il scriptse non lo si ha ancora. In ubunty è fornito dal bsdutilspacchetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.