Bash의 논리 모두/모두

Bash의 논리 모두/모두

일련의 테스트(각각 다른 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. PID2Bash는 이름이 특정 문자열로 시작하는 변수를 반복할 수 있지만 배열이 더 편리합니다. (이러한 변수가 올바른 배열을 전달할 수 없는 환경을 통해 스크립트 외부에서 오는 경우는 제외됩니다.)

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

관련 정보