여기서 grep이 파이프와 함께 작동하지 않는 이유는 무엇입니까?

여기서 grep이 파이프와 함께 작동하지 않는 이유는 무엇입니까?

다음 명령이 있습니다.

find / -name libGL.so.1

"권한 거부"가 포함된 많은 행을 반환합니다. 이 줄을 제외하고 싶었기 때문에 다음을 추가했습니다.

find / -name libGL.so.1 | grep -v 'denied'

그러나 출력은 동일합니다. my grep -v 'denied'Permission denied. 다양한 변형을 시도하고 grep 튜토리얼을 살펴보았지만 문제를 파악할 수 없습니다. 어떤 제안이 있으십니까?

답변1

이는 관련이 없습니다 grep. 파이프가 |표준 출력 스트림을 리디렉션하는 stdout반면 Permission denied메시지는 표준 오류 스트림에 있기 때문입니다 stderr. 입력을 grep 명령으로 파이프하기 위해 결합된 스트림 2>&1(파일 설명자가 있는 스트림을 2파일 설명자가 있는 스트림으로 리디렉션) 을 사용하여 원하는 것을 얻을 수 있습니다.1stderrstdout

find / -name libGL.so.1 2>&1 | grep -v 'denied'

그러나 보다 일반적인 접근 방식은 stderr직접 리디렉션하여 완전히 삭제하는 것 입니다./dev/null

find / -name libGL.so.1 2>/dev/null

2>&1 | 대신 |&를 사용하세요.

Bash 매뉴얼 페이지를 보면 다음 소개를 볼 수 있습니다.

사용되는 경우 |&명령의 표준 오류는 command2의 표준 입력으로 파이프됩니다 2>&1 |.

따라서 STDERR과 STDOUT을 연결하려는 경우 다음 구문을 사용할 수도 있습니다.

find / -name libGL.so.1 |& grep -v 'denied'

답변2

귀하의 명령은 다음과 같아야 합니다:

find / -name libGL.so.1 2>/dev/null

표준 오류(fd2)에 대한 권한에 대한 불만 사항을 찾아보세요. 이러한 줄을 제거하려면 표준 출력(>)을 비트 버킷(/dev/null)으로 리디렉션합니다.

답변3

"Permission Denied" 줄은 stderr(표준 오류) 스트림으로 이동하지만 grep을 통해 stdout(표준 출력)을 파이핑하고 있습니다.

stderr를 완전히 리디렉션할 수 있습니다.

find / -name libGL.so.1 2> /dev/null

답변4

다음을 사용하여 명령을 호출해 보셨습니까?스도?

sudo find / -name libGL.so.1

여전히 메시지가 표시되면 이미 언급한 리디렉션을 사용하세요.stderr(fd=2)에서 너바나(/dev/null)로:

sudo find / -name libGL.so.1 2> /dev/null

더 많은 아이디어여기, 행운을 빌어요!

관련 정보