다음 스크립트에서 스크립트 2>/dev/null의 용도는 무엇입니까? [복사]

다음 스크립트에서 스크립트 2>/dev/null의 용도는 무엇입니까? [복사]
$!/bin/sh
if grep "$1" /etc/passwd 2>/dev/null               #Search username at beging of line1
then
         echo "Pattern found - Job Over"
else 
         echo "Pattern not found"

fi

답변1

Bash에서 1은 stdout을 의미하고 2는 stderr(표준 오류 스트림)을 의미합니다.

/dev/null은 가상 장치입니다. 여기에 무엇이든 쓸 수 있으며 모든 것을 소비합니다(기본적으로 출력 제거).

따라서 2> /dev/null이는 이 명령의 오류 출력이 /dev/null로 리디렉션됨을 의미합니다. 본질적으로 이것이 의미하는 바는 오류 메시지를 제거하는 것입니다.

답변2

그 목적 은 진단 메시지를 특수 장치 파일로 리디렉션 (기록된 데이터 삭제)하여 생성된 오류를 2>/dev/null숨기는 것입니다 .grep/dev/null

/etc/passwd파일은 일반적으로 모든 사용자가 읽을 수 있으므로 오류 스트림을 리디렉션해야 하는 이유를 잘 모르겠습니다. 그러나 코드가 명령문 grep에 사용되기 때문에 유틸리티가 생성할 수 있는 출력(일치하는 행 )이 원치 않을 수 있으며 이 출력은 삭제됩니다. 따라서 코드에 있는 내용은 오타이며 작성자가 의도한 내용임을 제안합니다.if$1>/dev/null2

#!/bin/sh

if grep -e "$1" /etc/passwd >/dev/null; then
    echo "Pattern found - Job Over"
else 
    echo "Pattern not found"
fi

즉, echo두 문자열 중 실제 일치하는 줄은 삭제됩니다. -e문자열이 $1대시로 시작하는 경우 필수입니다. 또한 수정된 #!- 줄을 확인하세요.

리디렉션 없이도 이 작업을 수행할 수 있습니다.

#!/bin/sh

if grep -q -e "$1" /etc/passwd; then
    echo "Pattern found - Job Over"
else 
    echo "Pattern not found"
fi

일치하는 항목이 발견되면 종료되고 조용해집니다(일치하는 행을 출력하지 않음) -q.grep


만약 이것이 grep라면사용자 이름, 그런 다음 /etc/passwd사용

if getent passwd "$1" >/dev/null; then ...; fi

grep표현식을 올바르게 작성하지 않는 한 일반 텍스트를 사용하여 문자열을 하위 문자열로 포함하는 사용자 이름을 찾을 수 있으므로 더 나은 옵션이 될 것입니다 $1(정규식은 실제로 질문에 표시되지 않습니다). getent passwd주어진 사용자 이름이 데이터베이스에 없으면 명령은 0이 아닌 종료 상태로 종료됩니다 passwd.

이는 NIS 또는 LDAP 데이터베이스를 사용하여 사용자 정보를 저장하는 시스템에도 적용됩니다.아니요macOS에서 작동합니다( getent유틸리티 없음).

관련 정보