กู้คืนฟังก์ชันการทำงาน 'cd .. ' หลังจากติดตามลิงก์สัญลักษณ์


13

ถ้าฉันสร้างลิงค์สัญลักษณ์ใน terminal ด้วยคำสั่งเช่น

ln -s /path/to/some/directory symbolicLink

จากนั้นไปตามลิงก์ด้วย

cd symbolicLink

เทอร์มินัลดูเหมือนจะคิดว่า cwd ~/symbolicLink/ถึงแม้ว่ามันจะแสดงจริง~/path/to/some/directory/(สมมติว่ามีการทำลิงค์ใน~แน่นอน) สิ่งนี้หมายความว่าถ้าฉันพิมพ์cd ..ฉันถูกนำกลับไปที่~เพราะเทอร์มินัล 'คิดว่า' นี่คือต้นกำเนิดของ cwd

สิ่งที่ผมจะต้องเปลี่ยนเช่นที่cd ..แทนจะพาฉันไป~/path/to/some/คือจริงแม่ของ~/path/to/some/directory/?

คำตอบ:


15

ดู/programming/10456784/behavior-of-cd-bash-on-symbolic-links

คุณสามารถใช้ 'cd -P' เพื่อไปยังไดเรกทอรีหลัก "ของจริง" ดูความคิดเห็นแรกเกี่ยวกับคำตอบยอดนิยมเกี่ยวกับวิธีทำให้พฤติกรรมนี้เป็นค่าเริ่มต้น


5

มีข้อแม้ที่ละเอียดในcd -Pพฤติกรรม (โพสต์เป็นคำตอบเพราะความยาว):

$ dir1=$(mktemp --directory)
$ dir2=$(mktemp --directory)
$ ln -s -- "$dir1" /tmp/start
$ ln -s -- "$dir2" "$dir1"
$ cd "/tmp/start/"*
$ cd -P ..

สิ่งที่ควรpwdพิมพ์ตอนนี้ เหตุผลมันอาจเป็นได้ทั้ง

  1. $dir1ถ้าcd -P ..ทำcd ..ก่อนและcd -- "$(readlink -f)"หลังจากนั้นหรือ
  2. /tmpถ้าcd -P ..ทำcd -- "$(readlink -f)"ก่อนและcd ..หลังจากนั้น

ในความเป็นจริงมันทำหลังซึ่งหมายความว่าpwdเป็นระดับที่สองโดยสังหรณ์ใจสูงกว่าไดเรกทอรี "ผู้ปกครอง"


1
ขอบคุณ! cd -Pยังคงแก้ปัญหาที่ฉันเผชิญอยู่ แต่ก็ยังมีประโยชน์ที่จะรู้
Val


2

ฉันรู้สึกถึงความเจ็บปวดของคุณ - ฉันคิดว่าbashจะใช้งานแบบอินเตอร์แอคทีฟได้เนื่องจากพฤติกรรมนี้

tcshเป็นเชลล์ที่ใช้งานง่ายกว่ามากสำหรับการใช้งานแบบโต้ตอบ ออกbashจากการเขียนโปรแกรม (ถ้าคุณยืนยันในการเขียนเชลล์สคริปต์เมื่อมีทางเลือกที่ดีกว่าในหลาย ๆ ภาษาสคริปต์)

หากต้องการเปลี่ยนเชลล์สำหรับผู้ใช้ใด ๆ ให้พิมพ์chshที่บรรทัดคำสั่งและปฏิบัติตามคำแนะนำ (อีกครั้งฉันขอแนะนำ/bin/tcshและหนังสือ O'Reilly ยอดเยี่ยมโดยใช้ csh และ tcshซึ่งมีให้ใช้งานถัดจากสิ่งที่ไม่ได้ใช้)


ตั้งแต่ที่ฉันเขียนคำตอบนี้ฉันเรียนรู้ที่จะหยุดกังวลและรัก Bash สำหรับการใช้งานแบบโต้ตอบ แต่ฉันยังไม่สามารถจัดการกับcdพฤติกรรมเริ่มต้นสำหรับ symlink ฉันต้องจำไว้ว่าให้ใส่เครื่องset -o physicalของฉัน.bashrcหรือ.bash_profileทุกเครื่องที่ใช้
dodgethesteamroller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.