일련의 테스트(각각 다른 PID에서)를 실행하고 모든 테스트가 성공적으로 종료된 경우에만 성공 상태를 얻고 싶습니다. 그것은 마치
check $PID1 && check $PID2 && check $PID3
그러나 불확실한 수의 테스트의 경우. 어떻게 해야 하나요?
답변1
이것을 루프로 작성하는 것은 그리 어렵지 않을 것입니다:
pids=(1025 3425 6474)
check_all() {
for pid in "$@"; do
if ! check "$pid"; then
return 1
fi
done
}
check_all "${pids[@]}"
연결된 명령 체인과 마찬가지로 &&
이 기능은 첫 번째 실패 시 중지됩니다 check
.
하지만 변수 등을 단일 배열로 대체했습니다 PID1
. PID2
Bash는 이름이 특정 문자열로 시작하는 변수를 반복할 수 있지만 배열이 더 편리합니다. (이러한 변수가 올바른 배열을 전달할 수 없는 환경을 통해 스크립트 외부에서 오는 경우는 제외됩니다.)
check
또한 여기 루프에 명령을 하드코딩했습니다. 다양한 명령을 전달하여 함수를 실행할 수 있지만 이로 인해 단어 분리 및 인용 처리에 문제가 발생합니다. (바라보다여기그리고여기.)
답변2
-e
오류 발생 시 exit()를 사용하여 이를 서브셸에 넣을 수 있습니다 .
pids=(1025 3425 6474)
(
set -e
for pid in "${pids[@]}"; do
check "$pid"
done
)
echo $?
|| exit 1
또는 다음을 사용할 수 있습니다 set -e
.
pids=(1025 3425 6474)
(
for pid in "${pids[@]}"; do
check "$pid" || exit 1
done
)
echo $?
답변3
아마도:
parallel -j0 check ::: $pid1 $pid2 $pidN &&
echo all succeeded
parallel -j0 '! check' ::: $pid1 $pid2 $pidN &&
echo all failed
parallel -j0 --halt soon,success=1 check ::: $pid1 $pid2 $pidN &&
echo one succeeded
parallel -j0 --halt soon,fail=1 check ::: $pid1 $pid2 $pidN ||
echo one failed
검사를 병렬로 실행합니다. 결과를 아는 즉시 실행 중인 검사를 종료하려면 soon
로 바꾸십시오.now
파이프의 출력으로 PID가 있는 경우(한 줄에 하나씩):
pid_generator | parallel -j0 check && echo all succeeded
parallel
값을 부여하고 check
가능한 한 많은 값을 병렬로 실행합니다( ).check
-j0
아직 서버를 설치 하지 않은 경우 parallel
다음 기능을 갖춘 컴퓨터에서 실행하세요.가지다 parallel
설치하다:
parallel --embed > new_script
(마지막 5줄)을 편집 new_script
하고 스크립트를 서버에 복사합니다.
답변4
간단한 함수는 각 인수를 테스트할 수 있습니다. 실패할 경우 함수에서 0이 아닌 코드를 반환합니다.
#!/bin/sh
testall() {
for test
do
sh -c "$test" || return 1
done
}
몇 가지 예를 들어 테스트했습니다.
$ testall "echo 1" "echo 2" "false" && echo all OK
1
2
$ testall "echo 1" "echo 2" "echo 3" && echo all OK
1
2
3
all OK
$ testall && echo all OK
all OK