터미널이 아닌 bash 기능을 종료하십시오.


12

아래에 zookeeper를 설치하지만 아직 설치되지 않은 경우에만 bash 스크립트가 있습니다.

##zookeper
installZook(){

        ZOOK_VERSION="3.4.5"
        ZOOK_TOOL="zookeeper-${ZOOK_VERSION}"
        ZOOK_DOWNLOAD_URL="http://www.us.apache.org/dist/zookeeper/${ZOOK_TOOL}/${ZOOK_TOOL}.tar.gz"

        if [ -e $DEFAULT_INSTALLATION_DEST/${ZOOK_TOOL} ]; then
                echo "${ZOOK_TOOL} alreay installed";
                exit 1;      # <<<< here
        elif [ ! -e $DEFAULT_SOURCE_ROOT/${ZOOK_TOOL}.tar.gz ]; then
                wgetIt $ZOOK_DOWNLOAD_URL
        else
                echo "[info] : $DEFAULT_SOURCE_ROOT/$ZOOK_TOOL already exists"
        fi

        sudo mkdir -p /var/lib/zookeeper
        sudo mkdir -p /var/log/zookeeper

        tarIt "$DEFAULT_SOURCE_ROOT/$ZOOK_TOOL.tar.gz"
        sudo chmod 777 -R $DEFAULT_INSTALLATION_DEST/$ZOOK_TOOL
        cp $DEFAULT_INSTALLATION_DEST/$ZOOK_TOOL/conf/zoo_sample.cfg $DEFAULT_INSTALLATION_DEST/$ZOOK_TOOL/conf/zoo.cfg
cat >> ~/.bash_profile <<'EOF'

  ###############################
  ########### ZOOK ###############
  ###############################
  ZOOK_HOME=/usr/local/zookeper-3.4.5
  export ZOOK_HOME
  export PATH=$PATH:$ZOOK_HOME/bin

EOF
}

으로 표시된 줄 <<<< here에서 동물원 사육사가 이미 설치되어 있으면 원하는 스크립트를 종료하십시오. 그러나를 사용 exit하면 터미널 자체가 종료됩니다.


1
이 스크립트를 어떻게 시작합니까?
Benoit

2
사용 return 1대신에exit 1
polym

답변:


21

TL; DR

사용 return대신 exit과 함께 스크립트를 실행 source your-script.sh일명.. your-script.sh

세부 사항

설명이 포함 된 스크립트를 시작하는 경우 exit현재 자식의 자식으로 시작해야합니다.

당신이 당신의 터미널 세션을 시작의 현재 쉘 내부를 시작하면 (사용 . ./<scriptname>중 하나를 exit주요 쉘, 터미널 세션을 따라 시작을 닫습니다.

스크립트 bash ./<scriptname>(또는 bash 대신 다른 쉘 )를 시작 exit했다면 , 터미널에서 사용하는 것이 아니라 자식 쉘을 중지했을 것입니다.

스크립트에 실행 권한이있는 경우 쉘 이름을 지정하지 않고 직접 실행하면 하위 쉘에서도 실행됩니다.

사용 return대신하는 것은 exit여전히 사용하여 스크립트를 실행 할 수 있도록 . ./<script name>현재 쉘을 닫지 않고. 그러나 return함수 만 또는 소스 스크립트 (스크립트를 사용하여 . ./<scriptname>구문을 실행)를 종료 하려면 사용해야 합니다 .


return스크립트 파일을 중단하지 않습니다
Nam G VU

@NamGVU 종료하지 않고 돌아가는 것이 올바른 방법입니다. 파일 을 소싱 한 다음 함수를 호출한다고 가정하면 ( 주어진 파일을 소싱하는 동안 함수 에서 exit/ 가 호출 되지 않음)return 함수가 사용 되면 쉘 세션이 종료됩니다 (터미널과 함께) . 를 사용 하면 호출 쉘에 대한 제어를 다시 처리합니다. 소스 스크립트 (이것과 관련이없는)에서 돌아 오려면 쉘 세션을 종료 할 때 와 마찬가지로 올바른 방법으로 수행하십시오 . exitreturnreturnexit
Kusalananda

처음에 스크립트를 실행하는 방법에 따라 다릅니다.
Nam G VU

@NamGVU 파일에서 함수를 호출하지 않습니다. 파일을 소싱하거나 실행하면 함수가 호출되지 않습니다. 먼저 파일을 소싱 한 다음 터미널에서 호출하는 것 이외의 방법으로 함수가 쉘 세션과 터미널을 종료하는 방법을 설명하십시오.
Kusalananda

공유를위한 Thanjs. 나는 우리가 그 주제에서 너무 멀지 않다고 생각합니다.
Nam G VU

1

주어진 스크립트가 쉘 세션 (및 터미널)을 종료 할 수있는 유일한 방법은 스크립트를 소싱하고 ( installZook현재 쉘 세션에 기능 을 설치하기 위해 ) 쉘에서 기능을 실행하는 것입니다.

표시하고있는 것이 installZook함수 호출을 포함하는 더 큰 스크립트의 일부일 경우 스크립트가 소스 인 경우 함수는 터미널을 종료시킬 수 있지만 일반 쉘 스크립트로 실행되지는 않습니다.

exit현재 쉘 세션을 종료합니다. 함수가 실행되면 exit호출 한 쉘을 종료합니다.

return함수 (또는 소스 스크립트 파일)에서 반환합니다. 함수 대신에 함수를 exit사용 return하면 제어를 종료하지 않고 호출 환경 (아마도 함수를 호출 한 대화식 쉘)으로 제어를 리턴합니다.

installZook쉘 에서 함수 를 수동으로 실행하는 경우을로 변경하면 exit됩니다 return. 스크립트에 함수를 호출하고 표시하지 않는 다른 코드가있는 경우 해당 코드는 추가로 함수의 반환 상태에 반응해야합니다.

예를 들어

installZook || return

이것이 스크립트에서 함수의 일부가 아니고 스크립트를 소싱 한 경우 함수가 0이 아닌 종료 코드를 리턴하면 쉘에 제어를 리턴합니다.


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