มันขึ้นอยู่กับ. ใน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 bash
says:
pushd [-n] [dir]
[... ] เพิ่มdir
ไปยังไดเรกทอรีสแต็คที่ด้านบนทำให้มันเป็นไดเรกทอรีการทำงานใหม่ในปัจจุบันราวกับว่ามันได้รับการจัดเป็นอาร์กิวเมนต์ให้กับcd
builtin [ ... ]
การพิมพ์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"