왜 파이프 작업을 사용하여 grep하지 않습니까?


18

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

find / -name libGL.so.1

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

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

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

답변:


43

그와는 아무 상관 없습니다 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'

3
만약 파일이 존재 기괴한 이유 : 그들을 결합에 대한 추가 참고 /foo/bar/denied/libGL.so.1, 결합 stdoutstderr 다음 결과 숨겨 필터링
Izkata

5

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

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

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


4

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

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

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

2

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

sudo find / -name libGL.so.1

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.