为什么不通过管道传输apt-cache策略输出?


12

无法理解为什么

$ 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
PersianGulf 2015年

1
@MohsenPahlevanzadeh是的,现在尝试我提供的确切呼叫(包名称):-)
zerkms 2015年

3
@MohsenPahlevanzadeh是吗?抱歉,您确定已经阅读了问题(和标题)吗?
zerkms,2015年

2
@MohsenPahlevanzadeh不是不相等(甚至不接近)
zerkms'5

1
我运行了,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(stdout)出现了问题。我的意思是它不再写给tty了
-Esref

Answers:



10

中的重定向似乎有些作弊行为apt-cache。但是我们可以通过交换stdout和stderr来作弊!

试试这个,它应该工作:

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

7

如果运行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(stdout),因此不再将1写入stdout。而且,如果将2重定向到1,则会丢失它们两个。

编辑:这是来自apt-cache源代码的一些代码示例:

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

好的。有什么办法可以捕获它们两者吗?
zerkms,2015年

1
除了@Mr_Mig的答案,我找不到其他方法。(是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”);
Esref 2015年

顺便说一句,几分钟前我也被某人指出了同一点:-)还有一个可能更好的解决方案script -c "sudo apt-cache policy foo" | grep Unable,需要安装一个script。根据建议-我将在2天内在此处输入+50(SE不允许更早完成)
zerkms,2015年

2
@Esref您对“我在源代码apt apt-cache ...中发现...”的评论应该在答案中,因此请在此处添加它。+1。:
Faheem Mitha 2015年

噢,天哪,再也没有+50的赏金选择了:-(
zerkms,2015年

3

一种“更好”的解决方案是使用script实用程序:

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

这样,它将拦截所有输出并将其转发到stdout

唯一的缺点是,script如果还没有,则需要安装。ubunty它是由bsdutils包提供的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.