Не могу понять почему
$ apt-cache policy foo
N: Unable to locate package foo
но
$ apt-cache policy foo 2>&1 | grep .
пустой.
Где в последнем звонке я делаю неправильное предположение?
Исходное задание: мне нужно обработать apt-cache policy
вывод предположительно :-)
UPD :
foo
используемый в моем примере может быть заменен любым именем пакета, которого нет в вашем apt-get
индексе.
UPD 2 :
есть ответ с обходным путем. Дополнительная +50
награда будет присуждаться любому, кто объясняет, почему 2>&1
решение не работает.
# 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
и есть системный вызов,ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
я думаю, из-за этого вызова 1 (стандартный вывод) возникают проблемы. Я имею в виду, что это больше не написано в ttyОтветы:
Если stdout не является tty (т. Е. Это обычный файл или канал) и если
--quiet
опция не указана,apt-cache
действует так, как если бы вы ее передали--quiet=1
. Обходной путь должен передать это--quiet=0
выбор.источник
|&
Гольф2>&1 |
:-)Кажется, есть некоторое обманчивое поведение для перенаправлений в
apt-cache
. Но мы можем обмануть мошенника, поменяв stdout и stderr !Попробуйте это, оно должно работать:
источник
Если вы запустите
strace apt-cache policy foo 2>&1
команду, вы можете увидеть строкуioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
Поскольку эта команда манипулирует 1 (стандартный вывод), 1 больше не записывается в стандартный вывод. И если вы перенаправите 2 на 1, вы потеряли их обоих.
Изменить: Вот пример кода из исходного кода apt-cache:
источник
apt-cache policy foo 1>&2 2>&1 | grep .
) Но я нахожу, что в исходном коде apt apt-cache :) // Работа с stdout не является tty if (! Isatty (STDOUT_FILENO) && _config-> FindI ("quiet", -1) == - 1) _config-> Set ("quiet", "1");script -c "sudo apt-cache policy foo" | grep Unable
которое требует установкиscript
хотя. Как и советовали - я поставлю +50 здесь через 2 дня (SE не позволяет делать это раньше)«Лучшим» решением было бы использовать
script
утилиту:Таким образом он перехватывает весь вывод и передает его в
stdout
.Единственным недостатком является то, что вам нужно установить,
script
если у вас его еще нет. В Ubunty это предоставляетсяbsdutils
пакетом.источник