여러 개의 첨자를 포함하는 기본 스크립트가 있습니다. 기본 스크립트를 실행하면 모든 하위 스크립트가 순차적으로 실행되기 시작합니다. 일부 스크립트는 통과하고 일부는 실패할 수 있습니다. 이 기본 스크립트를 두 번째로 실행할 때 성공한 첨자 대신 실패한 첨자만 실행하고 싶습니다. 어떤 도움이라도 대단히 감사하겠습니다.
두 번째 질문은 "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 "$@"
말할 필요도 없이, 해당 첨자가 다시 실행될 수 있도록 파일을 표시하는 적절한 플래그를 제거하십시오.