여기서 파이프 작업을 사용하여 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 매뉴얼 페이지를 살펴보면 다음과 같은 문구를 발견할 수 있습니다.

를 사용 하면 |&명령의 표준 오류가 파이프를 통해 명령2의 표준 입력에 연결됩니다. 의 약어입니다 2>&1 |.

따라서 STDERR 및 STDOUT을 조인하려는 경우에도 이 구성을 사용할 수 있습니다.

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

답변2

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

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

Find가 표준 오류(fd2)에 대한 권한에 대해 불평하고 있습니다. 해당 줄을 제거하려면 표준을 비트 버킷(/dev/null)으로 리디렉션(>)하세요.

답변3

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

다음을 사용하여 stderr를 완전히 리디렉션할 수 있습니다.

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

답변4

다음으로 명령을 호출해 보셨나요?sudo?

sudo find / -name libGL.so.1

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

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

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

관련 정보