Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

การนำทาง Bash shell ด้วย pushd และ popd

ดัน และ ป๊อป คำสั่งเป็นคุณสมบัติในตัวของ Bash shell เพื่อช่วยให้คุณ "บุ๊กมาร์ก" ไดเร็กทอรีสำหรับการนำทางอย่างรวดเร็วระหว่างตำแหน่งต่างๆ บนฮาร์ดไดรฟ์ของคุณ คุณอาจรู้สึกว่าเครื่องอ่านบัตรเป็นวิธีที่รวดเร็วอย่างเหลือเชื่อในการนำทางคอมพิวเตอร์ของคุณ เพียงกดปุ่มไม่กี่ครั้ง คุณก็ไปได้ทุกที่บนฮาร์ดไดรฟ์ พื้นที่เก็บข้อมูลที่เชื่อมต่อ หรือการแชร์เครือข่าย แต่ความเร็วนั้นอาจพังได้เมื่อคุณพบว่าตัวเองต้องไปมาระหว่างไดเร็กทอรี หรือเมื่อคุณ "หลงทาง" ในระบบไฟล์ของคุณ นั่นแหละปัญหา ดัน และ ป๊อป ช่วยคุณได้

พุช

ที่พื้นฐานที่สุด ดัน ก็เหมือนกับ cd . จะพาคุณจากไดเร็กทอรีหนึ่งไปยังไดเร็กทอรีอื่น สมมติว่าคุณมีไดเรกทอรีชื่อ หนึ่ง ซึ่งมีไดเร็กทอรีย่อยชื่อ สอง ซึ่งมีไดเร็กทอรีย่อยชื่อ สาม และอื่นๆ หากไดเรกทอรีการทำงานปัจจุบันของคุณคือ หนึ่ง จากนั้นคุณสามารถย้ายไปที่ สอง หรือ สาม หรือที่ใดก็ได้ที่มี cd คำสั่ง:

$ pwd
หนึ่ง
$ cd สอง/สาม
$ pwd
สาม

คุณสามารถทำเช่นเดียวกันกับ พุช :

$ pwd
หนึ่ง
$ ดันสอง/สาม
~/one/two/three ~/one
$ pwd
สาม

ผลลัพธ์สุดท้ายของ ดัน เหมือนกับ cd แต่มีผลลัพธ์ขั้นกลางเพิ่มเติม:พุช สะท้อนไดเรกทอรีปลายทางและจุดเริ่มต้นของคุณ นี่คือ ไดเร็กทอรีสแต็ก . ของคุณ และมันเป็นสิ่งที่ทำให้ ดัน ไม่ซ้ำใคร

กอง

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

คุณสามารถย้ายทั่วทั้งระบบไฟล์ของคุณด้วย พุช; แต่ละครั้ง ตำแหน่งเดิมและตำแหน่งใหม่ของคุณจะถูกเพิ่มลงในสแต็ก:

$ ดันสี่
~/one/two/three/four ~/one/two/three ~/one
$ ผลักห้า
~/one/two/three/four/ ห้า ~/หนึ่ง/สอง/สาม/สี่ ~/หนึ่ง/สอง/สาม ~/หนึ่ง

เมื่อคุณสร้างสแต็กแล้ว คุณสามารถใช้มันเป็นคอลเลกชั่นของบุ๊กมาร์กหรือจุดอ้างอิงการเดินทางที่รวดเร็ว ตัวอย่างเช่น สมมติว่าในระหว่างเซสชันที่คุณทำงานมากภายใน ~/one/two/three/four/five โครงสร้างไดเร็กทอรีของตัวอย่างนี้ คุณรู้ว่าคุณเคยไป หนึ่ง เมื่อเร็วๆ นี้ แต่คุณจำไม่ได้ว่าอยู่ที่ไหนในพุช ซ้อนกัน. คุณสามารถดูสแต็กของคุณด้วย +0 (นั่นคือเครื่องหมายบวกตามด้วยศูนย์) อาร์กิวเมนต์ซึ่งบอก พุช ไม่ให้เปลี่ยนเป็นไดเร็กทอรีใด ๆ ในสแต็กของคุณ แต่ยังพร้อมท์ พุช เพื่อสะท้อนสแต็กปัจจุบันของคุณ:

$ กด +0
~/one/two/three/four ~/one/two/three ~/one ~/one/two/three/four/five

หรือคุณสามารถดูสแต็กด้วย dirs คำสั่ง และคุณสามารถดูหมายเลขดัชนีสำหรับแต่ละไดเร็กทอรีโดยใช้ -v ตัวเลือก:

$ dirs -v
0  ~/one/two/three/four
1  ~/one/two/three
2  ~/one
3  ~/one/ สอง/สาม/สี่/ห้า

รายการแรกในสแต็กของคุณคือตำแหน่งปัจจุบันของคุณ คุณสามารถยืนยันได้ด้วย pwd ตามปกติ:

$ pwd
~/one/two/three/four

เริ่มต้นที่ 0 (ตำแหน่งปัจจุบันของคุณและรายการแรกของสแต็กของคุณ) วินาที องค์ประกอบในสแต็กของคุณคือ ~/one ซึ่งเป็นจุดหมายปลายทางที่คุณต้องการ คุณสามารถก้าวไปข้างหน้าในกองของคุณโดยใช้ +2 ตัวเลือก:

$ กด +2
~/one ~/one/two/three/four/five ~/one/two/three/four ~/one/two/three
$ pwd
~/อัน

สิ่งนี้จะเปลี่ยนไดเร็กทอรีการทำงานของคุณเป็น ~/one และยังได้ย้ายสแตกเพื่อให้ตำแหน่งใหม่ของคุณอยู่ด้านหน้า

คุณยังสามารถย้อนกลับในสแต็กของคุณได้ ตัวอย่างเช่น หากต้องการไปที่ ~/one/two/three . อย่างรวดเร็ว จากเอาต์พุตตัวอย่าง คุณสามารถย้อนกลับได้ทีละรายการ โดยจำไว้ว่า ดัน เริ่มต้นด้วย 0:

$ ดัน -0
~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/four

การเพิ่มไปยังสแต็ก

คุณสามารถไปยังส่วนต่างๆ ของสแต็กได้ด้วยวิธีนี้ และจะยังคงเป็นรายการคงที่ของไดเร็กทอรีที่คุณเยี่ยมชมล่าสุด หากคุณต้องการเพิ่มไดเร็กทอรี เพียงแค่ระบุพาธของไดเร็กทอรี หากไดเร็กทอรีใหม่กับสแต็ก ไดเร็กทอรีจะถูกเพิ่มในรายการตามที่คุณคาดหวัง:

$ pushd /tmp
/tmp ~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/four

แต่ถ้ามีอยู่แล้วในสแต็ก จะเพิ่มเป็นครั้งที่สอง:

$ pushd ~/one
~/one /tmp ~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/four

แม้ว่าสแต็กมักถูกใช้เป็นรายการของไดเร็กทอรีที่คุณต้องการเข้าถึงอย่างรวดเร็ว แต่ก็เป็นประวัติที่แท้จริงของสถานที่ที่คุณเคยไป หากคุณไม่ต้องการเพิ่มไดเรกทอรีซ้ำซ้อนในสแต็ก คุณต้องใช้ +N และ -N สัญกรณ์

การลบไดเร็กทอรีออกจากสแตก

เห็นได้ชัดว่าสแต็กของคุณไม่สามารถเปลี่ยนรูปได้ คุณสามารถเพิ่มด้วย พุช หรือลบรายการด้วย popd .

ตัวอย่างเช่น สมมติว่าคุณเพิ่งใช้ พุช เพื่อเพิ่ม ~/one ไปยังสแต็กของคุณ ทำให้ ~/one ไดเร็กทอรีการทำงานปัจจุบันของคุณ หากต้องการลบองค์ประกอบแรก (หรือ "ศูนย์" ถ้าคุณต้องการ):

$ pwd
~/one
$ popd +0
/tmp ~/one/two/three ~/one ~/one/two/three/four/five ~/one /two/three/four
$ pwd
~/one

แน่นอน คุณสามารถลบองค์ประกอบใดก็ได้ โดยเริ่มนับที่ 0:

$ pwd ~/one
$ popd +2
/tmp ~/one/two/three ~/one/two/three/four/five ~/one/two/three/four
$ pwd ~/one

คุณยังสามารถใช้ popd จากด้านหลังสแต็กของคุณ เริ่มต้นด้วย 0 อีกครั้ง ตัวอย่างเช่น หากต้องการลบไดเร็กทอรีสุดท้ายออกจากสแต็กของคุณ:

$ popd -0
/tmp ~/one/two/three ~/one/two/three/four/five

เมื่อใช้แบบนี้ popd ไม่เปลี่ยนไดเร็กทอรีการทำงานของคุณ มันจัดการสแต็กของคุณเท่านั้น

ลักษณะการทำงานเริ่มต้นของ popd โดยไม่มีการโต้แย้งใดๆ คือการลบรายการแรก (ศูนย์) ออกจากสแต็กของคุณ และทำให้รายการถัดไปเป็นไดเร็กทอรีการทำงานปัจจุบันของคุณ

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

$ pwd
~/one
$ pushd ~/one/two/three/four/five
$ popd
$ pwd
~/one

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

$ pwd ~/one
$ pushd /tmp
$ cd {/etc,/var,/usr}; นอนหลับ 2001
[...]
$ popd
$ pwd
~/one

พุชและป๊อปในโลกแห่งความเป็นจริง

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

ใช้ พุช และ ป๊อป ในเชลล์สคริปต์สามารถดึงดูดใจได้ แต่โดยทั่วไป หลีกเลี่ยงได้ดีที่สุด พวกมันไม่สามารถพกพาได้นอก Bash และ Zsh และอาจดูไม่ชัดเมื่อคุณอ่านสคริปต์ซ้ำ (พุช +3 มีความชัดเจนน้อยกว่า cd $HOME/$DIR/$TMP หรือคล้ายกัน)

นอกเหนือจากคำเตือนเหล่านี้ หากคุณเป็นผู้ใช้ Bash หรือ Zsh ปกติ คุณสามารถและควรลอง พุช และ ป๊อป .