[unix] 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.

UPD 2 :

해결 방법이 있습니다. 솔루션이 작동하지 않는 +50이유를 설명하는 사람에게는 추가 현상금이 수여됩니다 2>&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


답변

에 리디렉션에 대한 약간의 불쾌한 행동이있는 것 같습니다 apt-cache. 그러나 stdout과 stderr교체 하여 사기꾼을 속일 수 있습니다 !

이것을 시도하십시오, 그것은 작동해야합니다 :

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


답변

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");


답변

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

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

그렇게하면 모든 출력을 가로 채서로 전달합니다 stdout.

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


답변