명령 출력 숨기기


31

패키지가 설치되어 있는지 여부와 포트 8080이 특정 프로세스에서 사용되고 있는지 여부를 확인하는 스크립트가 있습니다. 나는 bash에 전혀 경험이 없으므로 다음과 같이했다.

if dpkg -s net-tools; then
    if  netstat -tlpn | grep 8080 | grep java; then
        echo "Shut down server before executing this script"
        exit
    fi
else
    echo "If the server is running please shut it down before continuing with the execution of this script"
fi

# the rest of the script...

그러나 스크립트가 실행될 때 터미널 dpkg -s net-tools에서 netstat -tlpn | grep 8080 | grep java출력 과 출력을 모두 얻습니다. 필자는 원하지 않습니다. 출력을 숨기고 ifs 의 결과를 고수 할 수 있습니까?

또한 내가하고있는 일을하는 더 우아한 방법이 있습니까? 그리고 알 수있는 더 우아한 방법이 무엇 있는 경우 포트 8080 (이 사용되고 아닌 경우)를 사용하는 과정은?

답변:


53

모든 명령의 출력을 숨기려면 일반적으로 stdoutstderr로 리디렉션됩니다 /dev/null.

command > /dev/null 2>&1

설명:

1. command > /dev/null: command(stdout) 의 출력 을 /dev/null
2로 2>&1리디렉션 stderr합니다 . :로 리디렉션 stdout하므로 오류 (있는 경우)도/dev/null

노트

&>/dev/null: stdoutstderr로 리디렉션합니다 /dev/null. 하나의 대안으로 사용할 수 있습니다/dev/null 2>&1

무음grep : grep -q "string"표준 출력에 아무런 영향을 미치지 않고 조용히 또는 조용히 문자열을 일치시킵니다. 또한 출력을 숨기는 데 사용할 수 있습니다.

귀하의 경우에는 다음과 같이 사용할 수 있습니다.

if dpkg -s net-tools > /dev/null 2>&1; then
    if  netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1; then
    #rest thing
else
    echo "your message"
fi

여기서 if 조건은 이전과 같이 점검되지만 출력은 없습니다.

받는 사람 회신 코멘트 :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: grep java두 번째 파이프 이후에 발생한 출력을 리디렉션합니다 . 그러나 당신이받는 메시지 netstat -tlpn. 솔루션은 다음 if과 같이 두 번째 로 사용 됩니다.

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then

1
당신은 또한 말할 수있는 grep -q, 그리고 새로운 bash는 &> ...동의어에 대한 등> ... 2>&1
steeldriver

스크립트를 향상시킨 감사합니다. 그러나 루트로 실행되지 않아 일부 프로세스를 표시 할 수 없다는 메시지가 계속 표시됩니다. 이 발생합니다 netstat. 내가 그것을 숨길 수있는 방법이 있습니까?
dabadaba

1

lsof -i :<portnumnber> 원하는 라인을 따라 무언가를 할 수 있어야합니다.


나는이 게시물에 실제 질문을 추가하는 것을 잊었다 죄송합니다, 당신이 대답이 있기 때문에 그냥 "보조"질문하시기 바랍니다 agin 확인
dabadaba

또한 해당 명령의 출력에서 ​​프로세스 이름 / PID를 추출 할 수있는 방법이 있습니까?
dabadaba

동일한 작업을 수행하는 또 다른 방법은 fuser -n tcp 8080의 출력을 구문 분석하기가 더 쉽다 는 것입니다 .
fkraiem

0

출력을 플러시하는 /dev/null것이 가장 쉬운 방법 일 수 있지만 때로는 /dev/null루트가 아닌 경우 출력을 플러시 할 수 없도록 파일 권한이 설정되어 있습니다. 그래서 이것을 수행하는 또 다른 비 루트 방법은

command | grep -m 1 -o "abc" | grep -o "123"

이 이중 grep설정은 abc그들과 일치하는 줄을 찾은 후 -o설정되어 abc있기 때문에 오직 한 번만 인쇄됩니다 -m 1. 그런 다음 비어 있거나 출력이 abcgrep로 보내져 일치하는 문자열 부분 만 찾고 123마지막 명령 이후에만 abc빈 문자열이 출력 됩니다. 희망이 도움이됩니다!

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