คำสั่ง 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 ~-
นี่คือสมองของคุณบน