Thoát khỏi hàm bash, không phải thiết bị đầu cuối


12

Tôi có một tập lệnh bash như dưới đây để cài đặt Zookeeper nhưng chỉ khi chưa cài đặt.

##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
}

Tại dòng được đánh dấu <<<< here, nếu người quản lý vườn thú đã được cài đặt, điều tôi muốn là thoát khỏi tập lệnh bên dưới nó. Nhưng sử dụng exitthoát khỏi thiết bị đầu cuối chính nó.


1
Làm thế nào để bạn khởi chạy kịch bản này?
Benoit

2
sử dụng return 1thay vìexit 1
polym

Câu trả lời:


21

TL; DR

Sử dụng returnthay vì exitVÀ chạy tập lệnh của bạn với source your-script.shaka.. your-script.sh

Chi tiết đầy đủ

Nếu khởi chạy một tập lệnh có một exitcâu lệnh trong đó, bạn phải khởi chạy nó như một đứa trẻ của đứa trẻ hiện tại của bạn.

Nếu bạn khởi chạy nó bên trong lớp vỏ hiện tại bắt đầu với phiên cuối của bạn (sử dụng . ./<scriptname>bất kỳexit sẽ đóng lớp vỏ chính, thì lớp này bắt đầu dọc theo phiên cuối của bạn.

Nếu bạn đã khởi chạy tập lệnh của mình như bash ./<scriptname>(hoặc bất kỳ shell nào khác thay vì bash ), thì exitnó sẽ dừng shell con của bạn và không phải là shell được sử dụng bởi thiết bị đầu cuối của bạn.

Nếu tập lệnh của bạn có quyền thực thi, thì việc thực thi nó trực tiếp mà không đưa ra tên của trình bao cũng sẽ thực thi nó trong trình bao con.

Sử dụng returnthay vì exitsẽ cho phép bạn vẫn khởi chạy tập lệnh của mình bằng cách sử dụng . ./<script name>mà không đóng trình bao hiện tại. Nhưng bạn cần sử dụng returnđể thoát khỏi một chức năng hoặc một tập lệnh có nguồn gốc (tập lệnh được chạy bằng . ./<scriptname>cú pháp).


returnsẽ KHÔNG tạm dừng tệp tập lệnh
Nam G VU

@NamGVU Trở về thay vì thoát ra là điều nên làm. Giả sử rằng họ nguồn tệp và sau đó gọi hàm ( exit/ returntrong hàm sẽ không được gọi trong khi tìm nguồn của tệp đã cho), phiên shell sẽ chấm dứt (cùng với thiết bị đầu cuối) nếu hàm được sử dụng exit. Với return, nó sẽ xử lý kiểm soát trở lại vỏ gọi. Lưu ý rằng nếu bạn muốn trở về từ một tập lệnh có nguồn gốc (điều này không phải là về), returnlà cách chính xác để làm điều đó cũng như exitsẽ chấm dứt phiên shell.
Kusalananda

Nó phụ thuộc vào cách bạn chạy tập lệnh ở vị trí đầu tiên
Nam G VU

@NamGVU Không có cuộc gọi đến chức năng trong tệp. Chỉ cần tìm nguồn hoặc chạy tệp sẽ không gọi hàm. Giải thích cách hàm kết thúc phiên shell và terminal theo bất kỳ cách nào khác ngoài cách tìm nguồn đầu tiên của tệp và sau đó gọi nó trong terminal.
Kusalananda

Thanjs để chia sẻ. Tôi nghĩ rằng chúng ta sẽ không đi quá xa chủ đề.
Nam G VU

1

Cách duy nhất mà tập lệnh đã cho có thể chấm dứt phiên shell (và do đó là thiết bị đầu cuối) là bạn tìm nguồn cung cấp tập lệnh (để cài đặt installZookchức năng trong phiên shell hiện tại), sau đó chạy chức năng trong trình bao.

Nếu những gì bạn đang hiển thị chỉ là một phần của tập lệnh lớn hơn chứa lệnh gọi installZookhàm, thì hàm vẫn chỉ có thể khiến thiết bị đầu cuối chấm dứt nếu tập lệnh có nguồn gốc , nhưng không được chạy như một tập lệnh shell thông thường.

exitchấm dứt phiên shell hiện tại. Khi hàm thực thi, exitnó chấm dứt trình bao gọi nó.

returntrả về từ một hàm (hoặc tệp script có nguồn gốc). Nếu hàm, thay vì exit, được sử dụng return, nó sẽ trả lại quyền điều khiển cho môi trường gọi (có thể là vỏ tương tác mà bạn đã gọi hàm từ đó) mà không thoát khỏi nó.

Nếu bạn tự chạy installZookchức năng từ trình bao, thì tất cả những gì bạn cần làm là thay đổi exitthành return. Nếu có một đoạn mã khác trong tập lệnh của bạn gọi hàm (và mà bạn không hiển thị), thì đoạn mã đó cần phản ứng bổ sung với trạng thái trả về của hàm.

Ví dụ

installZook || return

Nếu đây là một phần của hàm không có trong tập lệnh và nếu bạn lấy nguồn của tập lệnh, nó sẽ trả lại quyền điều khiển cho trình bao nếu hàm trả về mã thoát khác không.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.