ความแตกต่างระหว่าง“ cd -” และ“ cd ~ -”


56

คำสั่ง Bash

cd - 

พิมพ์ไดเรกทอรีที่ใช้ก่อนหน้านี้และเปลี่ยนแปลงไป

ในทางกลับกันคำสั่ง Bash

cd ~-

เปลี่ยนเป็นไดเรกทอรีที่ใช้ก่อนหน้าโดยตรงโดยไม่ต้องสะท้อนอะไรเลย

นั่นคือความแตกต่างเท่านั้น? กรณีการใช้งานสำหรับแต่ละคำสั่งคืออะไร?


3
ฉันขอแนะนำให้คุณอย่าใช้สิ่งที่ยุ่งยากนี้ cd ~-นี่คือสมองของคุณบน
DepaniDaniel

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

คำตอบ:


81

มีสองสิ่งที่เล่นอยู่ที่นี่ ก่อนอื่น-เพียงอย่างเดียวจะขยายไปยังไดเรกทอรีก่อนหน้าของคุณ นี่คือการอธิบายในcdส่วนของman bash(เหมืองเน้น):

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

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

หาก tilde-prefix เป็น a ~+ค่าของตัวแปรเชลล์ PWD จะแทนที่ tilde-prefix หาก tilde-prefix เป็น a ~-ค่าของตัวแปรเชลล์ OLDPWD หากตั้งค่าไว้จะถูกแทนที่ หากอักขระที่ตามหลังเครื่องหมายตัวหนอนใน tilde-prefix ประกอบด้วยตัวเลข N ซึ่งนำหน้าด้วย a +หรือ a -ทางเลือก tilde-prefix จะถูกแทนที่ด้วยองค์ประกอบที่สอดคล้องกันจากไดเรกทอรีสแต็กซึ่งจะแสดงโดย dirs builtin ที่เรียกใช้ด้วย tilde-prefix เป็นอาร์กิวเมนต์ หากตัวอักษรต่อไปนี้ตัวหนอนในตัวหนอนคำนำหน้าประกอบด้วยตัวเลขโดยไม่มีชั้นนำ+หรือ-, +สันนิษฐาน

นี่อาจจะง่ายต่อการเข้าใจด้วยตัวอย่าง:

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

ดังนั้นโดยทั่วไป-หมายถึง "ไดเรกทอรีก่อนหน้า" นั่นเป็นเหตุผลว่าทำไมcd -ตัวมันเองจะย้ายคุณกลับไปยังที่ที่คุณอยู่

ความแตกต่างที่สำคัญcd -คือเฉพาะในcdตัว ถ้าคุณพยายามมันก็จะพิมพ์echo - เป็นส่วนหนึ่งของการทำงานการขยายตัวหนอนและพฤติกรรมในทำนองเดียวกันกับตัวแปร นั่นเป็นเหตุผลที่คุณสามารถและได้รับสิ่งที่มีความหมาย คุณสามารถใช้มันได้แต่คุณสามารถใช้มันในคำสั่งอื่นได้เช่นกัน ตัวอย่างเช่นซึ่งจะเทียบเท่ากับ-~-echo ~-cd ~-cp ~-/* .cp "$OLDPWD"/* .


1
set -xเพื่อพิมพ์คำสั่งที่ขยายออกมาก่อนที่จะดำเนินการอาจเป็นประโยชน์ในการแสดงให้เห็นถึงความแตกต่าง
Peter Cordes

1
@terdon วันนี้ฉันเรียนรู้
sitilge

ในระยะสั้น ... cd ~-/..งานcd -/..ไม่ได้!
เรย์ฟอสส์

13

~-อาจมีการขยายตัวหนอน (ดู man bash) ดังนั้นสิ่งที่cdเห็นคือชื่อไดเรกทอรีก่อนหน้าโดยตรง -ไม่ได้ถูกขยายโดยเชลล์cdเห็นมันโดยตรงและทำงานเป็นเอกสาร:

อาร์กิวเมนต์ของ - เทียบเท่ากับ $ OLDPWD หากใช้ชื่อไดเรกทอรีที่ไม่ว่างจาก CDPATH หรือถ้า - เป็นอาร์กิวเมนต์แรกและการเปลี่ยนไดเรกทอรีสำเร็จชื่อพา ธ สัมบูรณ์ของไดเรกทอรีทำงานใหม่จะถูกเขียนไปยังเอาต์พุตมาตรฐาน


4

TL; DR: cd -ถูกสร้างขึ้นในcd, ~-เป็นส่วนขยายต่อมาไม่เฉพาะเจาะจงกับ~[name]cd

POSIX.1-2008 Shell & Utilitiesกำหนดcd -เป็นกรณีพิเศษที่เฉพาะสำหรับcdคำสั่ง :

เมื่อ a -ถูกใช้เป็นตัวถูกดำเนินการสิ่งนี้จะเทียบเท่ากับคำสั่ง:

cd "$OLDPWD" && pwd

ซึ่งเปลี่ยนเป็นไดเร็กทอรีการทำงานก่อนหน้านี้จากนั้นเขียนชื่อของมัน

~-ส่วนขยายจะขยายไป$OLDPWDก่อนที่คำสั่งใด ๆ จะถูกดำเนินการและสามารถส่งผ่านเป็นอาร์กิวเมนต์สำหรับคำสั่งใด ๆ cdที่ไม่เพียง มันเป็นส่วนขยายต่อไปในและทุบตี

ดังกล่าวข้างต้น POSIX.1-2008 เชลล์และสาธารณูปโภคมาตรฐานนอกจากนี้ยังมีคำอธิบายที่ซับซ้อนของการขยายตัวหนอน การใช้ถ้อยคำมีความเฉพาะเจาะจงมากในการอนุญาตให้มี~-พฤติกรรมที่ไม่ได้กำหนดภายในขอบเขตของมาตรฐานโดยที่~[name]อ้างถึง$HOMEว่า[name]เป็นสตริงว่างหรือไดเรกทอรีภายในบ้านของผู้ใช้nameหากnameเป็นชื่อผู้ใช้ที่ถูกต้อง

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