/ bin / sh를 사용하여 stderr 및 stdout을 / dev / null로 리디렉션


61

나는 모두를 리디렉션하는 방법의 모든 종류의 시도 stdoutstderr에를 /dev/null어떤 성공하지. 나는이 문제가 없었던 거의 평생 동안 bash를 가지고 있지만 BSD에서는 한 번은 붙어 있습니다 /bin/sh.

내가 시도한 것 :

if ls ./python* 2> /dev/null; then
    echo found Python
fi

... 작동합니다. 파이썬이 없으면 ls의 에러 메시지를 뮤트합니다. 그러나 python.tgz존재하는 경우 다음과 같은 행이 출력됩니다.

# ./test.sh
./python-2.7.3p1.tgz

난 노력 했어:

if ls ./python* &> /dev/null; then
    echo found Python
fi

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi

if ls ./python* > /dev/null; then
    echo found Python
fi

실제로 작동하는 것은 없습니다. 출력 중 하나만 동시에 리디렉션 할 수는 없습니다.

답변:


102

이것은 모든 Posix 호환 쉘에서 작동합니다.

ls good bad >/dev/null 2>&1

stdout 을 stderr에 복제하기 전에 stdout을 먼저 리디렉션 해야합니다 . 그것을 먼저 복제하면 stderr은 stdout이 처음 지적한 것을 가리킬 것입니다.

Bash , zsh 및 일부 다른 쉘도 바로 가기를 제공합니다

ls good bad &>/dev/null

명령 줄에서는 편리하지만 이식성이 뛰어난 스크립트에서는 사용하지 않아야합니다.


1
실제로, 나는 본 쉘 매뉴얼을 읽었다. 그것은 이후 버전 밝혔다 /bin/sh구현 한 &>/dev/null구문을 aparently 그리거나 내가 (내가 충분해야한다 그래서 그래도 오픈 BSD 5.3을 실행, 어떤 방법으로 표시하지 수 있음) 이전 버전이
Torxed

8
@Torxed, OpenBSD sh는 pdksh를 기반으로합니다. 요즘에는 더 이상 Bourne 쉘이 없습니다. csh에서 소개 >&되었습니다 zsh. bash선택 &>(현재도 지원 zsh하고 일부 pdksh이후 명확하게 POSIX 준수를 나누기 불구하고 파생 상품) foo &> file완전히 다른 무언가를 의미 유효 POSIX 구문은 완벽하다.
Stéphane Chazelas 2016 년

3
@ StéphaneChazelas (...) 그것은 완전히 다른 것을 의미합니다.이 경우에 그것이 무엇을 의미하는지 궁금해
하셨습니다

4
@PiotrDobrogost foo &> filefoo & > fileor 와 비슷합니다 foo & : > file. 백그라운드에서 foo를 실행하고 명령을 전혀 쓰지 않기 위해 파일을 엽니 다 (그렇게 사용되지는 않음).
Stéphane Chazelas

5
@PiotrDobrogost, >&적합하지 않습니다 중 하나 그것은과 충돌로 >&2, >&-운영자. zshcsh 사용자 편의를 위해 추가했습니다 (csh에는 없음 >&2). 그것들은 단지 구문 설탕이며, > file 2>&1표준적이고 휴대 가능합니다 (Bourne와 같은 껍질에).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.