$!/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/null
2
#!/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
유틸리티 없음).