คำสั่ง Bash
cd -
พิมพ์ไดเรกทอรีที่ใช้ก่อนหน้านี้และเปลี่ยนแปลงไป
ในทางกลับกันคำสั่ง Bash
cd ~-
เปลี่ยนเป็นไดเรกทอรีที่ใช้ก่อนหน้าโดยตรงโดยไม่ต้องสะท้อนอะไรเลย
นั่นคือความแตกต่างเท่านั้น? กรณีการใช้งานสำหรับแต่ละคำสั่งคืออะไร?
คำสั่ง Bash
cd -
พิมพ์ไดเรกทอรีที่ใช้ก่อนหน้านี้และเปลี่ยนแปลงไป
ในทางกลับกันคำสั่ง Bash
cd ~-
เปลี่ยนเป็นไดเรกทอรีที่ใช้ก่อนหน้าโดยตรงโดยไม่ต้องสะท้อนอะไรเลย
นั่นคือความแตกต่างเท่านั้น? กรณีการใช้งานสำหรับแต่ละคำสั่งคืออะไร?
คำตอบ:
มีสองสิ่งที่เล่นอยู่ที่นี่ ก่อนอื่น-เพียงอย่างเดียวจะขยายไปยังไดเรกทอรีก่อนหน้าของคุณ นี่คือการอธิบายใน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"/* .
set -xเพื่อพิมพ์คำสั่งที่ขยายออกมาก่อนที่จะดำเนินการอาจเป็นประโยชน์ในการแสดงให้เห็นถึงความแตกต่าง
cd ~-/..งานcd -/..ไม่ได้!
~-อาจมีการขยายตัวหนอน (ดู man bash) ดังนั้นสิ่งที่cdเห็นคือชื่อไดเรกทอรีก่อนหน้าโดยตรง -ไม่ได้ถูกขยายโดยเชลล์cdเห็นมันโดยตรงและทำงานเป็นเอกสาร:
อาร์กิวเมนต์ของ - เทียบเท่ากับ $ OLDPWD หากใช้ชื่อไดเรกทอรีที่ไม่ว่างจาก CDPATH หรือถ้า - เป็นอาร์กิวเมนต์แรกและการเปลี่ยนไดเรกทอรีสำเร็จชื่อพา ธ สัมบูรณ์ของไดเรกทอรีทำงานใหม่จะถูกเขียนไปยังเอาต์พุตมาตรฐาน
TL; DR: cd -ถูกสร้างขึ้นในcd, ~-เป็นส่วนขยายต่อมาไม่เฉพาะเจาะจงกับ~[name]cd
POSIX.1-2008 Shell & Utilitiesกำหนดcd -เป็นกรณีพิเศษที่เฉพาะสำหรับcdคำสั่ง :
เมื่อ a
-ถูกใช้เป็นตัวถูกดำเนินการสิ่งนี้จะเทียบเท่ากับคำสั่ง:
cd "$OLDPWD" && pwdซึ่งเปลี่ยนเป็นไดเร็กทอรีการทำงานก่อนหน้านี้จากนั้นเขียนชื่อของมัน
~-ส่วนขยายจะขยายไป$OLDPWDก่อนที่คำสั่งใด ๆ จะถูกดำเนินการและสามารถส่งผ่านเป็นอาร์กิวเมนต์สำหรับคำสั่งใด ๆ cdที่ไม่เพียง มันเป็นส่วนขยายต่อไปในkshและทุบตี
ดังกล่าวข้างต้น POSIX.1-2008 เชลล์และสาธารณูปโภคมาตรฐานนอกจากนี้ยังมีคำอธิบายที่ซับซ้อนของการขยายตัวหนอน การใช้ถ้อยคำมีความเฉพาะเจาะจงมากในการอนุญาตให้มี~-พฤติกรรมที่ไม่ได้กำหนดภายในขอบเขตของมาตรฐานโดยที่~[name]อ้างถึง$HOMEว่า[name]เป็นสตริงว่างหรือไดเรกทอรีภายในบ้านของผู้ใช้nameหากnameเป็นชื่อผู้ใช้ที่ถูกต้อง
cd ~-นี่คือสมองของคุณบน