Tại sao cd ~ k (& tab) mở rộng thành cd ~ kernoops khi tôi đã có một thư mục có tên là ~ ~ kernel-ppa tựa trong pwd?


8

Tôi có một thư mục có tên ~kernel-ppabên trong ~/Downloads.

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

Bây giờ khi tôi gõ cd ~kvà nhấn Tabđể mở rộng tự động, trình bao mở rộng nó cd ~kernoops/thay vì cd ~kernel-ppa/mặc dù thư mục có cùng ký tự bắt đầu đã có sẵn.

Để mở rộng tự động để làm việc, tôi cần phải thoát nó với \. Do đó, sử dụng cd \~kvà nhấn Tabchính xác mở rộng nó đến cd \~kernel-ppa/. Ngay cả việc sử dụng cd \và nhấn Tabcũng không có mẹo.

Tại sao nó lại như vậy và tại sao tôi cần phải trốn thoát? Hơn nữa, những gì tôi đang thoát vì thậm chí ~không cần thiết để mở rộng tự động?

Nếu tôi đi theo luồng và chạy cd ~kernoops/và nhấn Enter, trạng thái thiết bị đầu cuối sẽ thay đổi thành //:

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://$ 

Điều này trông giống như /thư mục, nhưng pwdnói rằng nó là //. Chính xác thì nó là gì?


@ RaduRădeanu Cả, đó là "/ home / aditya / Tải xuống / ~ kernel-ppa"
Elliott Frisch

Đầu tiên, "cd ~ kernoops /" sẽ đưa bạn đến "cd / home / kernoops /" không tồn tại. Thay vào đó, bạn nhận được "cd //", một cách khác để viết "cd /" - đó là thư mục gốc của hệ thống tập tin gốc, trông có vẻ kỳ quặc.
Elliott Frisch

Về lý do tại sao lối thoát đơn "\\" hoạt động, hãy xem thư mục của bạn có treehoặc với lsvà bạn sẽ nhận thấy đó là thư mục con đầu tiên.
Elliott Frisch

@ElliottFrisch: Tôi chỉ nhận thấy rằng đó ~kernel-ppalà thư mục duy nhất bên trong nó; nếu tôi chỉ chạy cd và nhấn tab, nó sẽ mở rộng ra cd \~kernel-ppa/. Tôi cũng không cần phải trốn thoát!
Aditya

Đúng. Ngoài ra, nếu bạn tiếp tục nhấn TAB, bạn sẽ chuyển qua các lần hoàn thành có sẵn khác.
Elliott Frisch

Câu trả lời:


10

Như bạn biết, ~mở rộng đến thư mục nhà của bạn. Nhưng những gì bạn dường như đã bỏ lỡ là ~johnmở rộng đến thư mục chính của người dùng có tên "john".

Kiểm tra /etc/passwdtập tin của bạn :

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

Nó có một "người dùng hệ thống" được đặt tên kernoops(vì lý do báo cáo lỗi nội bộ). Vì vậy, khi bạn gõ cd ~kTabshell sẽ ưu tiên (1) cho việc mở rộng tên người dùng trước khi mở rộng thư mục cục bộ và bạn có cd ~kernoops. Bây giờ kết quả là thư mục nhà "kernoops" của người dùng /, vì vậy nó cdlà nó.

Trong vỏ của tôi zsh, tôi không có dấu gạch chéo kép (2):

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

Như một bên, tên thư mục này không được suy nghĩ tốt. Nó sẽ cần ba sự chăm sóc trong các kịch bản và bất cứ điều gì. Ý tưởng tồi tệ nhất tôi có thể nghĩ là nhúng một tab vào đó ...


Chú thích:

(1) Trong zsh, ngay cả khi tôi có một thư mục có tên ~xdirvà không có người dùng nào bắt đầu x; làm cd ~xTabkhông mở rộng và không trích dẫn ~lỗi đưa ra:

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

(2) Tôi có vẻ nhớ posix khiến một ngoại lệ cho ban đầu //trong một đường dẫn --- nó nên được duy trì bởi vì một số unix biến thể cũ (tôi đã sử dụng bô-lô với Domain / hệ điều hành mà có đó) được sử dụng //machine-name/...để truy cập liền mạch các máy khác hệ thống tập tin trong mạng cục bộ (bảo mật chưa được phát minh). Vì vậy, có lẽ bash là ở đây. Nếu bạn làm, cd ///bạn sẽ có bình thường /trong cả hai vỏ, mặc dù.

Vâng, được tìm thấy trên unix.se !


1
Một hệ điều hành kế thừa nổi tiếng khác sử dụng ký hiệu dấu gạch chéo kép như vậy, nhưng dấu gạch chéo của nó thường được viết ngược và tôi không chắc liệu nó có chấp nhận dấu gạch chéo về phía trước để truy cập các hệ thống tệp từ xa như thế không. ;-)
R .. GitHub DỪNG GIÚP ICE

7

Ký tự dấu ngã ( ~) có một ý nghĩa đặc biệt trong vỏ. Khi nó được nhìn thấy trong bất kỳ lệnh nào, nó được mở rộng thành tên của thư mục chính của bạn. Làm cd ~hoặc cd /home/adityalà như vậy, nó kết thúc trong thư mục nhà của bạn.

Bằng cách đặt một ký tự dấu gạch chéo ngược ( \) ở phía trước dấu ngã, bạn bảo shell không thực hiện việc mở rộng ký tự đặc biệt sau (đây là cái được gọi là thoát vỏ). Bằng cách cd \~bạn yêu cầu shell di chuyển đến một thư mục được gọi là ~sẽ nằm dưới thư mục bạn đang thực hiện lệnh. Vì vậy, làm cd \~kernel-ppasẽ thay đổi bạn vào thư mục được gọi ~kernel-ppa, đó là hành vi bình thường.

EDITED: thêm về ~

Nếu bạn viết tên người dùng của hệ thống của bạn sau ~, bạn sẽ được chuyển đến thư mục chính của người dùng đó. Thực hiện Tabmở rộng sau cd ~sẽ mở rộng sang tên người dùng hiện có trên hệ thống của bạn. Nếu Tabhoàn thành sau cd ~k, nó sẽ mở rộng thành ~ kernoops vì có người dùng tên kernoops trong người dùng hệ thống, với một thư mục chính của /. Khi mở rộng cd ~kkết quả thành cd ~kernoops/một dấu gạch chéo và thư mục chính /, bạn được chuyển đến //. Nhưng điều này hoàn toàn giống như một số bà mẹ /đã nói trước đó.


Cảm ơn câu trả lời. Sự kết hợp giữa câu trả lời của bạn và @ Rmano sẽ xóa hoàn toàn sự nhầm lẫn :)
Aditya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.