이유를 알 수 없습니다
$ 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
패키지로 제공됩니다 .