เหตุใด cd ~ k (& แท็บ) จึงขยายเป็น cd ~ kernoops เมื่อฉันมีโฟลเดอร์ชื่อ“ ~ kernel-ppa” ใน pwd อยู่แล้ว


8

ฉันมีโฟลเดอร์ชื่อภายใน~kernel-ppa~/Downloads

aditya@aditya-desktop:~$ cd Downloads/
aditya@aditya-desktop:~/Downloads$ ls
~kernel-ppa

ตอนนี้เมื่อฉันพิมพ์cd ~kและกดTabสำหรับการขยายตัวอัตโนมัติเปลือกขยายมันcd ~kernoops/แทนcd ~kernel-ppa/แม้ว่าโฟลเดอร์ที่มีตัวละครเริ่มต้นเดียวกันอยู่แล้ว

\สำหรับการขยายตัวโดยอัตโนมัติเพื่อทำงานผมต้องหนีด้วย ดังนั้นการใช้cd \~kและกดอย่างถูกต้องขยายไปยังTab cd \~kernel-ppa/แม้แต่การใช้cd \และการกดTabก็เป็นการหลอกลวง

ทำไมมันเป็นเช่นนั้นและทำไมฉันต้องหลบหนี ยิ่งไปกว่านั้นสิ่งที่ฉันหลบหนีเพราะ~ไม่จำเป็นต้องมีสำหรับการขยายอัตโนมัติ

หากฉันไปตามโฟลว์และรันcd ~kernoops/และกดEnterสถานะของเทอร์มินัลจะเปลี่ยนเป็น//:

aditya@aditya-desktop:~/Downloads$ cd ~kernoops/
aditya@aditya-desktop://$ pwd
//
aditya@aditya-desktop://$ ls
bin   cdrom  etc   initrd.img  lost+found  mnt  proc  run   srv  tmp  var
boot  dev    home  lib         media       opt  root  sbin  sys  usr  vmlinuz
aditya@aditya-desktop://$ 

นี้ดูเหมือนว่า/ไดเรกทอรี แต่บอกว่ามันเป็นpwd มันคืออะไรกันแน่?//


@ RaduRădeanuไม่ว่าจะเป็น "/ home / aditya / Downloads / ~ kernel-ppa"
Elliott Frisch

ก่อนอื่น "cd ~ kernoops /" กำลังพาคุณไปที่ "cd / home / kernoops /" ซึ่งไม่มีอยู่ แต่คุณจะได้รับ "cd //" ซึ่งเป็นอีกวิธีในการเขียน "cd /" ซึ่งเป็นไดเรกทอรีรากของระบบไฟล์รากซึ่งดูแปลก
Elliott Frisch

สำหรับสาเหตุที่การหลบหนีเดี่ยว "\\" ทำงานให้ดูที่โฟลเดอร์ของคุณด้วยtreeหรือกับlsและคุณจะสังเกตเห็นว่าเกิดขึ้นเป็นโฟลเดอร์ย่อยแรก
Elliott Frisch

@ElliottFrisch: ฉันเพิ่งสังเกตเห็นว่าตั้งแต่~kernel-ppaเป็นโฟลเดอร์เดียวภายใน; ถ้าฉันเพียงแค่เรียกใช้และกดแท็บจะขยายไปcd cd \~kernel-ppa/ฉันไม่จำเป็นต้องหลบหนีเช่นกัน!
Aditya

ใช่. นอกจากนี้หากคุณกด TAB ต่อไปคุณจะวนไปสู่ความสำเร็จอื่น ๆ ที่มีอยู่
Elliott Frisch

คำตอบ:


10

ดังที่คุณทราบ~ขยายไปยังโฮมไดเร็กตอรี่ของคุณ แต่สิ่งที่คุณพลาดไปคือ~johnขยายไปยังโฮมไดเร็กตอรี่ของผู้ใช้ที่ชื่อ "john"

ตรวจสอบ/etc/passwdไฟล์ของคุณ:

% grep ker /etc/passwd
kernoops:x:107:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false

มีชื่อ "ผู้ใช้ระบบ" kernoops(สำหรับเหตุผลในการรายงานข้อผิดพลาดภายใน) ดังนั้นเมื่อคุณพิมพ์cd ~kTabเปลือกจะช่วยให้การตั้งค่า (1) cd ~kernoopsการขยายตัวชื่อผู้ใช้ก่อนที่จะขยายตัวไดเรกทอรีท้องถิ่นและคุณมี ตอนนี้มันส่งผลให้ผู้ใช้ "kernoops" home dir คือ/ผู้ใช้ดังนั้นจึงcdเป็นไปได้

ในเปลือกของzshฉันฉันไม่มีเครื่องหมายทับสองชั้น (2):

[:/] % cd ~kernoops/ 
[:/] % pwd
/
[:/] % cd //
[:/] % pwd
/

นอกจากนี้ชื่อไดเรกทอรีนี้ก็ไม่ได้คิดดี มันจะต้องใช้ความระมัดระวังสามเท่าในสคริปต์และอะไรก็ตาม ความคิดเดียวที่แย่ที่สุดที่ฉันคิดได้คือการฝังแท็บไว้ในนั้น ...


เชิงอรรถ:

(1) ในzshแม้ว่าฉันจะมีไดเรกทอรีชื่อ~xdirและไม่มีผู้ใช้เริ่มต้นด้วยx; การทำcd ~xTabไม่ได้ขยายและไม่อ้างอิง~ข้อผิดพลาดของการให้:

[:~/tmp/x] %  mkdir \~xdir
[:~/tmp/x] % ls
~xdir
[:~/tmp/x] % cd ~xdir  
zsh: no such user or named directory: xdir
[:~/tmp/x] 1 % 

(2) ฉันดูเหมือนจะจำได้ว่า posix สร้างข้อยกเว้นสำหรับการเริ่มต้น//ในเส้นทาง --- ควรได้รับการปรับปรุงเพราะตัวแปร unix เก่าบางตัว (ฉันใช้apollosกับ Domain / OS ที่มีนั้น) ใช้//machine-name/...เพื่อเข้าถึงเครื่องอื่น ' ระบบไฟล์ในเครือข่ายท้องถิ่น (ยังไม่ได้คิดค้นความปลอดภัย) ดังนั้นอาจทุบตีอยู่ที่นี่ ถ้าคุณทำcd ///คุณจะมีความปกติ/ในเปลือกทั้งสองแม้ว่า

ใช่พบใน unix.se !


1
ระบบปฏิบัติการแบบดั้งเดิมที่รู้จักกันดีอีกตัวใช้เครื่องหมายรูปแบบสแลชสองครั้งเช่นนั้น แต่สแลชมักเขียนย้อนหลังและฉันไม่แน่ใจว่าจะยอมรับสแลชข้างหน้าสำหรับการเข้าถึงระบบไฟล์ระยะไกลเครือข่ายแบบนั้นหรือไม่ ;-)
R .. GitHub หยุดช่วย ICE

7

อักขระ tilde ( ~) มีความหมายพิเศษในเชลล์ เมื่อมันเห็นในคำสั่งใด ๆ มันจะถูกขยายเป็นชื่อของไดเรกทอรีบ้านของคุณ การทำcd ~หรือcd /home/adityaเหมือนกันมันจะจบลงในโฮมไดเร็กตอรี่ของคุณ

โดยการใส่เครื่องหมายแบ็กสแลช ( \) หน้าเครื่องหมายตัวหนอนคุณบอกเชลล์ว่าอย่าทำการขยายตัวอักขระพิเศษต่อไปนี้ (นี่คือสิ่งที่เรียกว่าเชลล์เอสเคป) เมื่อcd \~คุณขอให้เชลล์ย้ายไปยังไดเรกทอรีที่เรียก~ว่าอยู่ภายใต้ไดเรกทอรีที่คุณกำลังทำคำสั่ง การทำเช่นcd \~kernel-ppaนั้นจะเปลี่ยนคุณเป็นไดเรกทอรีที่เรียกว่า~kernel-ppaซึ่งเป็นพฤติกรรมปกติ

แก้ไข: เพิ่มเติมเกี่ยวกับ ~

หากคุณเขียนชื่อผู้ใช้ของระบบของคุณหลังจาก~นั้นคุณจะถูกย้ายไปยังโฮมไดเรกทอรีของผู้ใช้นั้น การTabขยายหลังจากนั้นcd ~จะขยายไปยังชื่อผู้ใช้ที่มีอยู่ในระบบของคุณ ถ้าทำTabเสร็จหลังจากcd ~kนั้นก็ขยายไป ~ kernoops เนื่องจากมีผู้ใช้ชื่อkernoops/ในการใช้ระบบที่มีไดเรกทอรีบ้านของ ขณะที่การขยายตัวของcd ~kผลเข้าcd ~kernoops/ด้วยเครื่องหมายทับต่อท้ายและ BEEING ไดเรกทอรีบ้านคุณจะย้ายไป/ //แต่นี่เป็นสิ่งเดียวกับ/ที่บางคนพูดไว้ก่อนหน้านี้แล้ว


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