2010-05-12 5 views
3

나는이 같은 여러 파이프 명령이 있습니다.linux CLI IO 리디렉션을 영구적으로 만들 수있는 방법이 있습니까?

find [options] | grep [options] | xargs grep [options] 

잠재적 내가 그래서 관심이 아니에요 오류 (권한 오류, 공간 -에 - 파일 이름 오류 등)을 생산할 수있는 그들 각각은, 내가 원하는 모든 오류를/dev/null로 리디렉션합니다. 각 명령에 대해 2>/dev/null, 을 사용하여이 작업을 수행 할 수 있음을 알고 있습니다. IO 리다이렉션을 지속적으로 설정할 수 있습니까? 이상적으로는 명령의 시작/끝 부분에서 한 번만 설정하면 모든 후속/선행 파이프 명령에 영향을 미칩니다. 또한 IO 리다이렉션을 영구적으로 설정할 수있어 리셋 될 때까지 모든 명령에 계속 영향을 미칠 수 있습니까? 나는 떠들썩한 파티를 사용하고

은 (내가 bash는 내장 명령에 대한 매뉴얼 페이지를 확인하고 표시하지 않은 '>'와 상단의 '<'문자, 그래서 나는 리눅스 것 ... 미안하다고 가정)

+0

이것은 superuser.com에 속합니다. – bmargulies

+0

IO 리다이렉션에 대한 질문은 쉘에 따라 다릅니다. (예를 들어, tcsh는 완전한 기능을 갖춘 리다이렉션을 가지고 있지 않기 때문에 처음부터 끝내야합니다.) bash를 사용하고있는 것 같습니다. 맞습니까? – Cascabel

+0

@bmargulies : 정말요? 쉘 스크립트 언어로 컴퓨터 프로그램을 작성할 수는 없습니까? – Cascabel

답변

7

나는 bash 또는 적어도 어떤 종류의 Bourne과 같은 쉘을 사용한다고 가정 할 것입니다.

나는 또한 당신이 피하고 싶은 것은 다음과 같은 것을 믿고있어 :

find ... 2>/dev/null | grep ... 2>/dev/null | xargs ... 2>/dev/null 

즉 파이프 라인의 각 세그먼트에 대한 2>/dev/null 부분을 반복.

당신이 그렇게 할 수 있습니다 : 다음과 같이 영구적으로 리디렉션을 설정할 수 있습니다

(find ... | grep ... | xargs ...) 2>/dev/null 

:

exec 2>/dev/null 

을하고 (즉, STDOUT 가정 및 STDERR는 전과 같은 장소를 가리키는되었다) 다음을 사용하여 실행 취소 할 수 있습니다.

exec 2>&1 
+0

괄호로 묶는 것이 내가 필요한 것입니다. 감사합니다. exec를 사용하면 쉘을 고정시키는 것처럼 보입니다. – monguin

+0

물론 나는 명령을 직접 입력하는 대신 스크립트 내에서이 작업을 수행하고 있다고 가정하고 있습니다 ... 두 제안 모두 대화 형으로 작동하지만 두 번째 제안은 프롬프트를 만드는 데 단점이 있습니다. 또한/dev/null로 이동하십시오! – psmears

+0

나는 stderr 만/dev/null에 갈 것이라고 생각했다. bash 구문을 더 잘 이해할 필요가 있다고 생각합니다. – monguin

0

리디렉션 된 stderr로 새 셸을 시작하고 거기에서 파이프 라인을 실행하십시오. 그것은 작동하는 것 같다

뭔가

$ bash 2>/dev/null -c "find [options] | grep [options] | xargs grep [options]" 

처럼 (즉, 눈에 보이는 출력) 나는 물론

$ bash 2>/dev/null -c "echo nope 1>&2" 

할 때, 부작용은 까다로운 일이 될 것입니다 없다는 것이다 예기치 못한 일이 생겼을 때 어떤 일이 일어 났는지 이해하기 위해,하지만 그건 당신의 사업입니다.

+0

서브 쉘은 유도 된 추가 인용 레이어를 제거합니다.'(exec 2>/dev/null; foo | bar | baz)' –

+0

@Chris, 그렇습니다. 저는 쉘 프로그래밍에 관해서는 항상 느리고 체계적입니다. 그것은 자연스럽게 나에게 오지 않습니다. 그래서 psmears는 우리 둘 다를 이겼습니다. – dmckee

관련 문제