pushd, popd vs cd, cd- in bash และ zsh


16

มีความแตกต่างระหว่างพฤติกรรมของ pushd / popd ใน bash vs zsh หรือไม่? ดูเหมือนว่าใน zsh cd, cd- ทำงานเหมือนกับ pushd / popd (ซึ่งจะเพิ่ม / pops directory โดยอัตโนมัติเมื่อ cd) ในขณะที่ bash cd ไม่มีผลต่อ dir stack

หากใครบางคนสามารถให้ฉันตัวชี้ที่จะดี


ฉันเท่านั้นที่สามารถพูดคุยกับทุบตี: การใช้cdชุดตัวแปรเปลือกOLDPWDไปยังไดเรกทอรีก่อนหน้านี้และได้รับการแปลเป็นcd - cd "$OLDPWD"
เกล็นแจ็คแมน

@glennjackman ขอบคุณ นั่นหมายความว่าใน bash cd ไม่มีอะไรทำ w / pushd / popd?
dragonxlwang

ฉันเพิ่งตรวจสอบและpushdตั้งค่าOLDPWD
เกล็นแจ็คแมน

และความกระหายน้ำกลับมาโดยdirsถือ PWD เป็นองค์ประกอบแรกเสมอ
เกล็นแจ็คแมน

ใช่ แต่มันก็สมเหตุสมผลเป็นอย่างมากหาก cd ไม่ได้แตะสแต็ค dir ซึ่งจัดการโดย pushd / popd ใน bash
dragonxlwang

คำตอบ:


17

มันขึ้นอยู่กับ. ในzshคุณสามารถกำหนดค่าcdให้กดไดเรกทอรีเก่าบนไดเรกทอรีสแต็คโดยอัตโนมัติ แต่ไม่ใช่การตั้งค่าเริ่มต้น

เท่าที่ฉันสามารถบอกได้zshด้วยการตั้งค่าเริ่มต้นจะทำงานคล้ายกับbash:

  • cd somedir
    • เปลี่ยนไดเรกทอรีเป็น somedir
    • บันทึกไดเรกทอรีต้นฉบับใน OLDPWD
    • ชุด PWD="somedir"
    • แทนที่องค์ประกอบบนสุดของไดเรกทอรีสแต็ก (ดังแสดงโดยdirs) ด้วยsomedir(จำนวนองค์ประกอบบนสแต็กจะไม่เปลี่ยนแปลง)
  • cd -:
    • เปลี่ยนไดเรกทอรีเป็น $OLDPWD
    • ค่า swap ของPWDและOLDPWD
    • แก้ไของค์ประกอบด้านบนของไดเรกทอรีสแต็คเพื่อสะท้อน (ใหม่) PWD
  • pushd somedir:
    • เปลี่ยนไดเรกทอรีเป็น somedir
    • บันทึกไดเรกทอรีต้นฉบับใน OLDPWD
    • ชุด PWD="somedir"
    • ดันsomedirไปยังไดเรกทอรีสแต็ก (ขยายโดยองค์ประกอบหนึ่ง)
  • popd:
    • บันทึกไดเรกทอรีต้นฉบับใน OLDPWD
    • ลบองค์ประกอบแรกของสแต็กไดเรกทอรี
    • เปลี่ยนไดเรกทอรีเป็นองค์ประกอบยอดนิยมใหม่ของสแต็กไดเรกทอรี
    • ตั้งค่าPWDเป็นองค์ประกอบยอดนิยมใหม่ของสแต็กไดเรกทอรี

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

  • ในbashไดเรกทอรีทำงานปัจจุบันถือว่าเป็นองค์ประกอบด้านบนของสแต็กไดเรกทอรี The man 1 bashsays:

    pushd [-n] [dir]

    [... ] เพิ่มdirไปยังไดเรกทอรีสแต็คที่ด้านบนทำให้มันเป็นไดเรกทอรีการทำงานใหม่ในปัจจุบันราวกับว่ามันได้รับการจัดเป็นอาร์กิวเมนต์ให้กับcdbuiltin [ ... ]

    การพิมพ์DIRSTACK( echo ${dirstack[@]}) $PWDยืนยันว่าองค์ประกอบแรกเป็นเหมือน

  • ในzshไดเรกทอรีทำงานปัจจุบันไม่ได้เป็นส่วนหนึ่งของไดเรกทอรีกอง (แต่ยังคงแสดงด้วยdirs) man 1 zshbuiltinsพูดว่า:

    pushd [ -qsLP ] [ arg ]

    […] เปลี่ยนไดเรกทอรีปัจจุบันและผลักไดเรกทอรีปัจจุบันเก่าไปยังไดเรกทอรีสแต็ก ในรูปแบบแรกเปลี่ยนไดเรกทอรีปัจจุบันเพื่อหาเรื่อง [ ... ]

    การพิมพ์dirstack( echo ${dirstack[@]}) และการเปรียบเทียบกับผลลัพธ์ของdirsควรแสดงให้เห็นว่าไม่ได้PWDเป็นส่วนหนึ่งของ

ในทั้งสองเชลล์จะdirsพิมพ์ไดเรกทอรีการทำงานปัจจุบันเป็นองค์ประกอบแรก นอกจากนี้ในทั้งเปลือกหอยองค์ประกอบไดเรกทอรีสแต็คที่มีดัชนีหมายถึงไดเรกทอรีซึ่งเป็นปัจจุบันก่อนที่สุดท้าย1 pushdนั่นเป็นเพราะในอาร์เรย์zshมักจะมีหมายเลขตั้งแต่1ขณะที่พวกเขามีหมายเลขตั้งแต่ใน0 bashดังนั้นจึงมีความแตกต่างในทางปฏิบัติเล็กน้อย


ดังที่ได้กล่าวไว้ข้างต้นพฤติกรรมนี้สามารถแก้ไขzshได้

หากคุณตั้งค่าAUTO_PUSHDตัวเลือกในzsh( setopt autopushd) cd somedirจะทำงานเหมือนpushd somedirไดเรกทอรีก่อนหน้าจะถูกส่งไปยังสแต็กไดเรกทอรีโดยอัตโนมัติ นี่อาจเป็นกรณีในเครื่องของคุณ คุณสามารถเรียกใช้setoptเพื่อรับรายการตัวเลือกที่ไม่ได้ตั้งค่าเริ่มต้น ดูว่าautopushdจะปรากฏในรายการ

แต่ตอนนี้ไม่ได้ปรับเปลี่ยนการทำงานเช่นcd - popdแต่มันเป็นเพียงแค่ผลักลงบนสแต็คไดเรกทอรีและการเปลี่ยนแปลงไดเรกทอรีไป$PWD $OLDPWDนั่นหมายความว่าการโทรซ้ำ ๆcd -จะทำให้ไดเรกทอรีสแต็คโตขึ้น ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)) ถ้ามันมีพฤติกรรมเหมือนจริงpopdในระบบของคุณฉันจะแนะนำว่าcdจริงๆแล้วเป็น builtin ( whence -v cd); เป็นไปได้ว่าแทนที่ด้วยนามแฝงหรือฟังก์ชัน

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


วัตถุประสงค์ของไดเรกทอรีสแต็กนอกเหนือจากการมองผ่านdirsคืออะไร?
Xerus

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