ออกจากฟังก์ชัน bash ไม่ใช่เทอร์มินัล


12

ฉันมีสคริปต์ทุบตีด้านล่างซึ่งติดตั้ง Zookeeper แต่ถ้าไม่ได้ติดตั้งแล้ว

##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
คุณจะเปิดตัวสคริปต์นี้ได้อย่างไร
เบอนัวต์

2
ใช้return 1แทนexit 1
polym

คำตอบ:


21

TL; DR

ใช้returnแทนexitและเรียกใช้สคริปต์ด้วยsource your-script.shaka. your-script.sh

รายละเอียดแบบเต็ม

หากเปิดใช้งานสคริปต์ที่มีexitคำสั่งอยู่คุณจะต้องเปิดใช้งานมันเป็นลูกของลูกปัจจุบันของคุณ

หากคุณเรียกใช้งานภายในเชลล์ปัจจุบันที่เริ่มต้นด้วยเซสชันเทอร์มินัลของคุณ (การใช้. ./<scriptname>ใด ๆexitจะปิดเชลล์หลักจะเป็นการเริ่มต้นตามเซสชันเทอร์มินัลของคุณ

หากคุณได้เปิดใช้งานสคริปต์ของคุณเช่นbash ./<scriptname>(หรือเปลือกอื่น ๆ แทนการทุบตี ) แล้วก็exitจะหยุดเปลือกลูกของคุณและไม่ได้เป็นคนที่ใช้โดย terminal ของคุณ

หากสคริปต์ของคุณมีสิทธิ์ในการเรียกใช้งานการเรียกใช้งานโดยตรงโดยไม่ให้ชื่อของเชลล์จะดำเนินการในเชลล์ย่อย

ใช้returnแทนexitจะช่วยให้คุณยังคงเปิดใช้งานสคริปต์ของคุณโดย. ./<script name>ไม่ต้องปิดเปลือกปัจจุบัน แต่คุณต้องใช้returnเพื่อออกจากฟังก์ชั่นเท่านั้นหรือสคริปต์ที่มา (สคริปต์ทำงานโดยใช้. ./<scriptname>ไวยากรณ์)


returnจะไม่หยุดไฟล์สคริปต์
Nam G VU

@NamGVU การกลับมาแทนที่จะออกจากเป็นสิ่งที่ถูกต้อง สมมติว่าพวกเขาแหล่งไฟล์แล้วเรียกใช้ฟังก์ชัน (คนexit/ returnในการทำงานจะไม่ถูกเรียกว่าในขณะที่การจัดหาไฟล์กำหนด), เซสชั่นเปลือกจะยุติ (ร่วมกับขั้ว) exitถ้าฟังก์ชั่นที่ใช้ ด้วยreturnมันจะจัดการควบคุมกลับไปที่เปลือกเรียก โปรดทราบว่าหากคุณต้องการกลับมาจากสคริปต์ที่มา (ซึ่งไม่เกี่ยวกับ) returnเป็นวิธีที่ถูกต้องในการทำเช่นเดียวกับที่exitจะยุติเซสชันเชลล์
Kusalananda

ขึ้นอยู่กับว่าคุณจะรันสคริปต์อย่างไรตั้งแต่แรก
Nam G VU

@NamGVU ไม่มีการเรียกใช้ฟังก์ชันในไฟล์ เพียงแค่การจัดหาหรือเรียกใช้ไฟล์จะไม่เรียกใช้ฟังก์ชัน อธิบายวิธีการที่ฟังก์ชั่นยุติเซสชั่นเชลล์และเทอร์มินัลด้วยวิธีอื่นที่ไม่ใช่โดยการหาไฟล์ก่อนแล้วจึงเรียกมันในเทอร์มินัล
Kusalananda

Thanjs สำหรับการแบ่งปัน ฉันคิดว่าเราจะไม่ไปไกลจากหัวข้อนี้
Nam G VU

1

วิธีเดียวที่สคริปต์ที่กำหนดสามารถยุติเซสชันเชลล์ (และเทอร์มินัล) คือคุณทำการจัดหาสคริปต์ (เพื่อติดตั้งinstallZookฟังก์ชั่นในเซสชันเชลล์ปัจจุบัน) จากนั้นเรียกใช้ฟังก์ชันในเชลล์

หากสิ่งที่คุณแสดงเป็นเพียงส่วนหนึ่งของสคริปต์ที่มีขนาดใหญ่กว่าซึ่งมีการเรียกใช้installZookฟังก์ชันดังนั้นฟังก์ชันยังสามารถทำให้เทอร์มินัลสิ้นสุดลงหากสคริปต์มีที่มาแต่ไม่ผ่านการเรียกใช้เป็นสคริปต์เชลล์ธรรมดา

exitยุติเซสชันเชลล์ปัจจุบัน เมื่อฟังก์ชั่นการดำเนินการexitมันจะยุติเชลล์ที่เรียกว่า

returnส่งคืนจากฟังก์ชัน (หรือไฟล์สคริปต์ที่มา) หากฟังก์ชั่นแทนการexitใช้returnก็จะกลับมาควบคุมสภาพแวดล้อมการโทร (อาจจะเป็นเปลือกโต้ตอบที่คุณเรียกว่าฟังก์ชั่นจาก) โดยไม่ต้องออกมัน

หากคุณทำงานด้วยตนเองinstallZookฟังก์ชั่นจากเปลือกแล้วสิ่งที่คุณควรจะต้องทำคือการเปลี่ยนไปexit returnถ้ามีอีกชิ้นหนึ่งของรหัสในสคริปต์ของคุณที่เรียกฟังก์ชั่น (และที่คุณจะไม่แสดง) แล้วว่าชิ้นส่วนของความต้องการรหัสนอกจากนี้ยังตอบสนองต่อสถานะการกลับมาของฟังก์ชั่น

ตัวอย่างเช่น

installZook || return

หากนี่เป็นส่วนหนึ่งของฟังก์ชั่นที่ไม่มีในสคริปต์และหากคุณจัดหาสคริปต์มันจะส่งคืนการควบคุมไปยังเชลล์หากฟังก์ชันส่งคืนโค้ดออกที่ไม่ใช่ศูนย์


0

แทนการใช้ลองใช้exit 1return 1


1
returnจะกลับจากInstallZook()ฟังก์ชันไม่ใช่ออกจากสคริปต์
Barmar

@Barmar ดูความคิดเห็นดังกล่าวข้างต้น
Kusalananda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.