왜 파이프 작업을 사용하여 grep하지 않습니까? 많은 행을 반환합니다. 그런 줄을

다음과 같은 명령이 있습니다.

find / -name libGL.so.1

“Permission denied”와 함께 많은 행을 반환합니다. 그런 줄을 제외하고 싶기 때문에 다음을 추가했습니다.

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

그러나 출력은 동일합니다.-로 grep -v 'denied'줄을 필터링하지 않습니다 Permission denied. 많은 변형을 시도하고 grep 자습서를 살펴 보았지만 문제를 파악할 수 없습니다. 어떤 제안?



답변

그와는 아무 상관 없습니다 grep– 파이프가 있기 때문에 그것의 |표준 출력 스트림을 리디렉션 stdout반면 Permission denied메시지가 표준 오류 스트림에있다 stderr. 당신은 당신이 사용하여 스트림을 결합하여 원하는 결과를 얻을 수 2>&1(그 파일 기술자 인 스트림 리디렉션 2그 파일 기술자 인 스트림을 1정도) 그 stderr뿐만 아니라 같은 stdout위한 grep 명령의 입력에 파이프됩니다

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'

답변

당신의 명령은 다음과 같아야합니다 :

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

찾기에서 표준 오류 (fd2)에 대한 권한에 대해 불평하고 있습니다. 이러한 행을 제거하려면 표준 (>)을 비트 버킷 (/ dev / null)으로 리디렉션하십시오.


답변

“permission denied”라인은 stderr (표준 오류) 스트림으로 가고 있지만 grep을 통해 stdout (표준 출력)을 파이프하고 있습니다.

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

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

답변

sudo 명령을 호출 해 보셨습니까 ?

sudo find / -name libGL.so.1

여전히 메시지가 표시되면 이미 언급 한 stderr (fd = 2)를 nirvana (/ dev / null)로 리디렉션하십시오 .

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

더 많은 아이디어가 있습니다 , 행운을 빌어 요!