파이프라인을 고려하면
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 2
sed
||
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