한 프로세스에서 다른 프로세스로 출력을 파이프하려면 어떻게 해야 합니까? 단, 첫 번째 프로세스에 출력이 있을 때만 수행합니까?

한 프로세스에서 다른 프로세스로 출력을 파이프하려면 어떻게 해야 합니까? 단, 첫 번째 프로세스에 출력이 있을 때만 수행합니까?

출력이 있는 경우 이메일을 보내도록 이 명령을 어떻게 다시 작성할 수 있습니까 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.

관련 정보