명령의 출력을 리디렉션하는 방법은 무엇입니까?


14

의 모든 ping출력 없이 내 네트워크 상태를 모니터링하는 간단한 스크립트를 작성하려고합니다 .

ping -q -c 1 google.com > /dev/null && echo online || echo offline

문제는 연결되지 않은 경우에도 여전히 출력에 오류 메시지가 표시된다는 것입니다.

ping: unknown host google.com
offline

이 오류 메시지를 출력에서 ​​유지하려면 어떻게해야합니까?

답변:


28

실행할 때 :

ping -q -c 1 google.com > /dev/null && echo online || echo offline

당신은 본질적으로 단지 스트림 1 (즉,의 출력 리디렉션 stdout에를) /dev/null.

정상적인 프로그램 실행으로 생성 된 출력을 리디렉션하려는 경우에 좋습니다. 그러나 모든 오류, 경고 또는 실패로 인한 출력을 리디렉션하려는 경우 stderr또는 표준 오류 스트림 도로 리디렉션해야 합니다 /dev/null.

이를 수행하는 한 가지 방법은 다음 >과 같이 리디렉션 연산자로 리디렉션하려는 스트림 수를 앞에 추가하는 것입니다.Command 2> /dev/null

따라서 명령은 다음과 같습니다.

ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline

그러나 이미 하나의 스트림을로 리디렉션했습니다 /dev/null. 동일한 리디렉션에서 단순히 피기 백을하지 않는 이유는 무엇입니까? Bash를 통해 리디렉션 할 스트림 번호를 지정하여이 작업을 수행 할 수 있습니다. 2>&1.

&리디렉션 연산자 뒤 의 문자를 확인하십시오. 이것은 쉘에 다음에 나타나는 것이 파일 이름이 아니라 출력 스트림의 식별자임을 알려줍니다.

ping -q -c 1 google.com > /dev/null 2>&1  echo online || echo offline

리디렉션 연산자에주의하십시오. 순서는 중요합니다. 잘못된 순서로 리디렉션하면 예기치 않은 결과가 발생합니다.

완전한 묵음을 얻는 또 다른 방법은 모든 출력 스트림을 /dev/null이 바로 가기 를 사용 &>/dev/null하도록 리디렉션하는 것입니다 (또는로 로그 파일로 리디렉션 &>/path/to/file.log).

따라서 다음과 같이 명령을 작성하십시오.

ping -q -c 1 google.com &> /dev/null && echo online || echo offline

1
아하 &>/dev/null. 즉각적인 도움에 감사드립니다!
operalala

4
Be careful with the redirection operators, their order matters a lot., 그러나 실제로 사용하는 예는 포함하지 않았습니다2>&1
Izkata

나는 그것을 추가하는 것을 잊었다! 예제를 반영하도록 수정 된 답변입니다. 손에 시간이 좀 더 있으면 주문 방법도 설명하겠습니다.
darnir

9

표준 출력 ( >또는 1>)과 표준 오류 ( 2>)를 모두 리디렉션해야합니다 .

ping -q -c 1 google.com > /dev/null 2>/dev/null && echo online || echo offline

또는 하나를 다른 것으로 리디렉션하십시오.

ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

8
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
online

$ ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline
offline

핑 가속화

ping구현 에 따라 단일 카운트로 제한 될 수 있습니다 -c 1. 일부 구현에서는 이보다 아래로 내려갈 수 있지만 잘못된 조회 시간이 초과 될 때까지 기다려야합니다. 따라서 대신 ping사용하는 fing것이 좋습니다.

핑 실패 속도 저하

$ date; ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:10 EST 2014
online
Tue Jan 28 13:51:10 EST 2014

$ date; ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:15 EST 2014
offline
Tue Jan 28 13:51:25 EST 2014

실패는 훨씬 빠릅니다

$ date; fing -p google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:21 EST 2014
online
Tue Jan 28 13:49:22 EST 2014

$ date; fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:35 EST 2014
online
Tue Jan 28 13:49:38 EST 2014

1
차라리 time수동으로 시간 차이를 계산하는 것보다 명령을 사용하고 싶습니다 date.time { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
Ruslan

@Ruslan-감사합니다. 나는 b / c 출력을 원했습니다 date. 다른 사람이 생성 된 출력을 읽는 것이 더 쉽습니다.
slm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.