apt-cache 정책 출력이 파이프되지 않는 이유는 무엇입니까?

apt-cache 정책 출력이 파이프되지 않는 이유는 무엇입니까?

왜인지 이해가 안 돼요

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

하지만

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

비었다.

후자의 호출에서 내가 어디에서 잘못된 가정을 하였습니까?

apt-cache policy초기 작업: 아마도 출력을 처리해야 할 것 같습니다 :-)

UPD:

foo내 예에서 사용된 패키지 이름은 다른 패키지 이름으로 대체될 수 있습니다.존재하지 않는다당신의 색인에 apt-get.

업데이트 2:

답변과 해결 방법이 있습니다. 이 솔루션이 작동하지 않는 이유를 설명할 수 있는 사람은 누구나 +50추가 포상금을 받게 됩니다.2>&1

답변1

stdout이 tty가 아니고(즉, 일반 파일 또는 파이프) --quiet옵션이 지정되지 않은 apt-cache경우 이를 전달한 것처럼 처리됩니다 --quiet=1. 해결책은 옵션을 전달하는 것입니다 --quiet=0.

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

답변2

의 리디렉션에 일부 부정행위가 있는 것 같습니다 apt-cache. 하지만 우리는 사기꾼을 속일 수 있습니다.stdout과 stderr를 교환하세요!

이것을 시도해 보세요. 작동할 것입니다.

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

답변3

명령을 실행하면 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");

답변4

"더 나은" 솔루션은 script유틸리티를 사용하는 것입니다.

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

이런 방식으로 모든 출력을 가로채서 stdout.

script유일한 단점은 아직 설치하지 않은 경우 설치해야 한다는 것입니다. 우분티에서는 bsdutils패키지로 제공 됩니다 .

관련 정보