
왜인지 이해가 안 돼요
$ 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
패키지로 제공 됩니다 .