스크립트 자체에서 스크립트를 완전히 다시 시작하는 방법


22

메뉴와 하위 메뉴, 옵션 등으로 쉘 스크립트를 설정하고 있습니다. 그러나 각 메뉴 / 하위 메뉴 / 등에서 "기본 메뉴로 돌아 가기"선택이 필요합니다.

이미 메뉴가 설정되어 있으며 정상적으로 작동하지만 스크립트를 처음부터 다시 시작하고 모든 변수 등을 재설정하는 방법이 필요합니다.

또는 현재 스크립트를 종료하고 다시 시작하는 방법입니다.

나는 이것을 시도했다.

ScriptLoc=$(readlink -f "$0")
./ScriptLoc

그러나 "이전"스크립트 내에서 "새"스크립트가 시작되므로 "새"스크립트를 종료하면 "이전"스크립트로 돌아갑니다. 스크립트 종류의 스크립트입니다.

누구나 완전히 다시 시작하는 방법에 대한 아이디어가 있습니까?


$ScriptLoc어쨌든 그것은 ./ScriptLoc현재 디렉토리에서 해당 이름의 스크립트를 찾습니다.
poolie

답변:



10

다음과 같은 것을 사용할 수 있습니다.

$(basename $0) && exit

$(basename $0)현재 스크립트의 새 인스턴스를 작성하고 스크립트 exit의 현재 인스턴스를 종료합니다.

위의 방법을 강조한 테스트 스크립트는 다음과 같습니다.

#!/bin/bash

if ! [[ $count =~ ^[0-9]+$ ]] ; then
    export count=0
fi

echo $count

if [ $count -le 10 ]; then
    count=$(echo "$count+1" | bc)   
    ./$(basename $0) && exit #this will run if started from the same folder
fi

echo "This will be printed only when the tenth instance of script is reached"

사용하지 않는 경우 export count=0(수 있도록하는 count환경 변수를 수) 만 사용 count=0(수 있도록하는 cont로컬 스크립트 변수를) 다음 스크립트는 정지 않을 것입니다.


&& exit스크립트가 성공한 경우에만 종료됩니다. 예를 들어 스크립트가 실행 가능하지 않거나 구문 오류가있는 경우 이는 방금 돌릴 수 있습니다.
poolie

기본 이름에 ./를 추가했습니다. 그렇지 않으면 아름다운 솔루션입니다. 정말 좋았습니다. +1을 방어하십시오.
Lefty G Balogh

4

현재 실행중인 스크립트를 확실하게 얻는 것이 생각보다 어렵습니다. http://mywiki.wooledge.org/BashFAQ/028을 참조 하십시오 .

대신 다음과 같이 할 수 있습니다.

main_menu() { 
    printf '1. Do something cool\n'
    printf '2. Do something awesome\n'
    : ... etc
}

some_sub_sub_menu() {
    ...
    printf 'X. Return to main menu\n'
    ...
    if [[ $choice = [Xx] ]]; then
        exit 255
    fi
}

while true; do
    (main_menu)
    res=$?
    if (( res != 255 )); then
        break
    fi
done

기본적으로 서브 쉘에서 main_menu 함수를 실행하므로 main_menu 또는 서브 메뉴를 종료하면 메인 쉘이 아닌 서브 쉘을 종료합니다. 종료 상태 255는 여기서 "다시 이동"을 의미하도록 선택됩니다. 다른 종료 상태는 무한 루프에서 빠져 나옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.