파이프라인의 명령이 어떻게 파이프라인을 중단할 수 있나요?

파이프라인의 명령이 어떻게 파이프라인을 중단할 수 있나요?

파이프라인을 고려하면

a | b | c

b오류가 발생하거나 입력 스트림의 특정 패턴과 일치하는 경우 파이프라인을 중단 하려면 무엇을 변경해야 합니까 ?b

답변1

@모스비매우 도움이 된다답변예전에는최대맞습니다. 그러나 b()"die"가 발생하는지 여부에 관계없이 항상 파이프라인을 중단하는 문제가 있습니다.sed /die/q

입력 스트림에 "die"가 포함되어 있습니다.

$ b(){ sed /die/q && kill "$BASHPID"; }; printf '%s\n' pass die oops | b | cat; echo "${PIPESTATUS[@]}"
pass
die
0 143 0

입력 스트림확실히"죽음"이라는 단어가 포함되어 있습니다.

$ b(){ sed /die/q && kill "$BASHPID"; }; printf '%s\n' pass oops | b | cat; echo "${PIPESTATUS[@]}"
pass
oops
0 143 0

@mosvy 버전에서는 "die"가 발생하면 종료 코드 0이 반환되므로(성공) b()파이프라인이 항상 중단됩니다.sed /die/q또는입력 스트림의 끝에 도달했으므로 b()항상 호출됩니다 kill "$BASHPID".

아래 버전에서는 b()파이프가 중단 되도록 @mosvy의 답변을 수정했습니다.오직입력 스트림에서 "die"를 발견하면:

입력 스트림에 "die"가 포함되어 있습니다.

b() {
  sed '/die/{q 2}' || kill "$BASHPID"
}

# Send "die" to b.
printf '%s\n' pass die oops | b | cat

echo "${PIPESTATUS[@]}"

산출:

pass
die
0 2 0

입력 스트림확실히"죽음"이라는 단어가 포함되어 있습니다.

b() {
  sed '/die/{q 2}' || kill "$BASHPID"
}

# Do not send "die" to b.
printf '%s\n' pass oops | b | cat

echo "${PIPESTATUS[@]}"

산출:

pass
oops
0 0 0

이 버전에서는 "die"가 발견 b()되면 종료 코드 2(실패)로 즉시 종료하는 명령을 sed호출합니다 . 그런 다음 이 명령이 호출 되어 파이프의 프로세스를 종료 하고 파이프를 중단합니다. (이 버전에는q 2sed||kill "$BASHPID"b()암소 비슷한 일종의 영양sed어느확장 명령q종료 코드를 허용합니다. )

@mosvy가 언급했듯이 "의식적인 자살"을 저지르는 대신 다음 프로세스부터 시작하세요 b().exit

b() {
  sed '/die/{q 2}' || exit 3
}

# Send "die" to b.
printf '%s\n' pass die oops | b | cat

echo "${PIPESTATUS[@]}"

산출:

pass
die
0 3 0

관련 정보