출력이 있는 경우 이메일을 보내도록 이 명령을 어떻게 다시 작성할 수 있습니까 mailq | grep
?
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email
한줄로 가능할까요?
바라보다파이프가 비어 있는지 확인하고 비어 있으면 데이터에 대해 명령을 실행하십시오.이메일을 보내는 것보다 더 일반적인 경우입니다.
답변1
&&
grep이 다음과 같은 일치 항목이 있음을 나타내는 종료 상태를 반환하는 경우에만 연산자를 사용하여 메일 명령을 실행할 수 있도록 이 작업을 수행하려면 임시 파일을 사용해야 한다고 생각합니다.
TMPFILE=`mktemp /tmp/mailqgrep.XXXXXX`; mailq | egrep 'rejected|refused' -A5 -B5 > "$TMPFILE" && mail -s 'dd' email@email < "$TMPFILE"; rm "$TMPFILE"
임시 파일이 어딘가에 남아 있어도 괜찮고 정적 이름을 사용할 수 있는 경우 특수 이름 지정 및 삭제 작업을 건너뛸 수 있습니다.
mailq | egrep 'rejected|refused' -A5 -B5 > /tmp/mailqgrep && mail -s 'dd' email@email < /tmp/mailqgrep
편집하다:본 후글렌의 대답나는 좀 더 놀았고 $()
구문을 사용하여 변수를 할당하면 명령의 종료 코드가 반환되므로 문자열 길이에 대한 테스트를 건너뛰고 사용할 수 있습니다. 이 모든 것이 하나의 명령으로 이루어집니다.
data=$(mailq | egrep 'rejected|refused' -A 5 -B 5) && mail -s 'dd' email@email <<< "$data"
편집 2:본 후사이먼의 대답나는 내 mail
프로그램을 확인했다. 그가 설명한 기본값과 동일한 방식으로 작동하지는 않지만 옵션이 있습니다. 매뉴얼 페이지에서:
-E
보내는 메시지의 첫 번째 또는 유일한 메시지 부분에 텍스트가 포함되어 있지 않으면 전송되지 않고 자동으로 삭제되어 프로그램이 시작될 때 Skipemptybody 변수가 효과적으로 설정됩니다. 이는 cron(8)에 의해 시작된 스크립트에서 메시지를 보내는 데 유용합니다.
이것을 가능하게 하십시오:
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -E -s 'dd' email@email
답변2
공익사업만약에표준 입력이 비어 있지 않은 경우 명령을 실행하기 위해 명시적으로 존재합니다.
mailq | egrep 'rejected|refused' -A 5 -B 5 | ifne mail -s 'dd' email@email
ifne 명령은더 많은 유틸리티패키지는 "유닉스가 아직 어렸을 때 오래 전에는 누구도 작성할 생각을 하지 못했던 점점 늘어나는 유닉스 도구 모음"으로 평가됩니다.
답변3
출력을 변수에 저장한 다음 문자열 길이가 0이 아닐 때 mail 명령을 호출할 수 있습니다.
data=$(mailq | egrep 'rejected|refused' -A 5 -B 5)
[[ -n "$data" ]] && mail -s 'dd' email@email <<< "$data"
한 줄에 두 명령을 세미콜론으로 연결합니다.
답변4
이 특별한 경우에는mail
이 -E
옵션을 지지 한다면, 그냥 사용하세요. 일반적으로 단어를 읽으려고 시도할 수 있습니다. 단어가 있는 경우 사후 처리 명령을 시작하고 파일의 나머지 부분에서 해당 문자를 제공합니다.
pipe_if_not_empty () {
a=$(dd bs=1 count=1 2>/dev/null; echo .) # read at most one character
if [ "$a" != "." ]; then # if there were two characters,
{ printf %s "${a%.}"; # then output the first character
cat; } | # and the rest of the input
"$@" # into the specified program
fi
}
mailq | egrep 'rejected|refused' -A 5 -B 5 |
pipe_if_not_empty mail -s 'dd' email@email
note의 유용한 용도 cat
. 추가하면 echo .
입력의 첫 번째 문자가 줄 바꿈인 경우에도 함수가 작동합니다(이 $(…)
구성은 터미널 줄 바꿈을 제거한다는 점을 기억하세요).
대부분의 쉘(내가 아는 한 zsh를 제외한 모든 쉘)에서 파일이 널 문자로 시작하면 이 코드는 해당 파일이 비어 있는 것으로 간주합니다. 이 문제를 해결하는 것은 독자의 연습 과제로 남겨집니다. (팁: od
첫 번째 서브셸에서 사용하고 printf
첫 번째 바이트를 인쇄합니다.) (해결책:파이프가 비어 있는지 확인하는 방법) 파일이 현재 로케일에서 유효한 문자가 아닌 바이트로 시작하는 경우 동일한 문제가 발생할 수 있습니다. 를 사용하여 이 코드를 실행하면 이 문제를 해결하는 것이 더 쉽습니다 LC_ALL=C
.