다음번에는 실패한 bash 스크립트만 실행해야 합니다.

다음번에는 실패한 bash 스크립트만 실행해야 합니다.

여러 개의 첨자를 포함하는 기본 스크립트가 있습니다. 기본 스크립트를 실행하면 모든 하위 스크립트가 순차적으로 실행되기 시작합니다. 일부 스크립트는 통과하고 일부는 실패할 수 있습니다. 이 기본 스크립트를 두 번째로 실행할 때 성공한 첨자 대신 실패한 첨자만 실행하고 싶습니다. 어떤 도움이라도 대단히 감사하겠습니다.

두 번째 질문은 "r"은 모든 스크립트에 공통적이지만 "d"는 선택 사항이라는 주장이 있다는 것입니다. 예: mainscript.sh -r India -d 2021-05-21 하지만 첫 번째 첨자에는 d 매개변수가 없으므로 실행할 때마다 실패합니다. 이 잘못된 인수를 무시하고 스크립트를 실행하려면 어떻게 해야 합니까?

#!/bin/bash

recall() {
script1.sh $* ;
script2.sh $* ;
script3.sh $* ;
script4.sh $* ;
script5.sh $* 
exit
}
recall $*

답변1

스크립트(또는 모든 프로그램)가 한 번만 실행되도록 하는 일반적인 방법은 상태를 유지하는 플래그를 어딘가에 만드는 것입니다.

이 예의 목적을 위해 사용자의 홈 디렉터리에 파일이 있는지를 플래그로 사용합니다. 파일이 있으면 응용 프로그램이 성공적으로 실행된 것이므로 다시 실행하면 안 됩니다.

#!/bin/bash
flag="$HOME/.my_script.flg"
{[ ! -f "$flag" ]] && my_script && touch "$flag"

여기에서는 파일이 존재하는지 테스트합니다 $flag. 존재하지 않는 경우 외부 스크립트를 실행 my_script하고 성공/0 상태로 종료되면 $flag파일을 생성합니다. 경쟁 조건이 있습니다. 이 제어 스크립트의 두 인스턴스를 동시에 실행하면 두 번째 스크립트가 이미 동일한 하위 스크립트를 실행하기 시작할 때까지 첫 번째 스크립트가 플래그 파일을 생성하지 못할 수 있습니다. 나는 간다이 질문을 무시하세요전제는 사용자가 자신이 무엇을 하고 있는지 알아야 한다는 것입니다. 그렇지 않은 경우 스크립트의 단일 인스턴스만 동시에 실행되도록 해야 합니다.

이는 특정 상황에 따라 확장될 수 있습니다.

#!/bin/bash
recall() {
    local script flag
    for script in script{1,2,3,4,5}.sh
    do
        flag="$HOME/.${script%.sh}.flg"
        [[ ! -f "$flag" ]] && "$script" "$@" && touch "$flag"
    done
    exit 0
}
recall "$@"

여기서 $script변수는 실행될 첨자 또는 함수의 이름을 반복하는 데 사용됩니다. 우리는 각각이 0성공적으로 반환한다고 가정하고, 그렇지 않으면 0이 아닌 반환을 반환합니다.

성공 시 전체 종료 상태를 성공으로, 실패 시 0이 아닌 상태로 설정하려면 0스크립트를 약간 확장해야 합니다. 실행된 모듈 수에 관계없이 실패한 모듈 수를 반환합니다.

#!/bin/bash
recall() {
    local script flag error=0
    for script in script{1,2,3,4,5}.sh
    do
        flag="$HOME/.${script%.sh}.flg"
        if [[ ! -f "$flag" ]]
        then
            if "$script" "$@"
            then
                touch "$flag"
            else
                ((error++))
            fi
        fi
    done
    return $error
}
recall "$@"

말할 필요도 없이, 해당 첨자가 다시 실행될 수 있도록 파일을 표시하는 적절한 플래그를 제거하십시오.

관련 정보