มันขึ้นอยู่กับ. ใน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ตัวเลือก
สำหรับตัวเลือกเพิ่มเติมมีลักษณะที่คู่มือการใช้งาน
cdชุดตัวแปรเปลือกOLDPWDไปยังไดเรกทอรีก่อนหน้านี้และได้รับการแปลเป็นcd -cd "$OLDPWD"