Mengapa cd ~ k (& tab) berkembang menjadi cd ~ kernoops ketika saya sudah memiliki folder bernama "~ kernel-ppa" di pwd?

8

Saya memiliki folder bernama ~kernel-ppadi dalam ~/Downloads.

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

Sekarang ketika saya mengetik cd ~kdan menekan Tabuntuk ekspansi otomatis, shell mengekspansi ke cd ~kernoops/bukan cd ~kernel-ppa/meskipun folder dengan karakter awal yang sama sudah ada.

Agar ekspansi otomatis berfungsi, saya harus menghindarinya \. Dengan demikian, menggunakan cd \~kdan menekan Tabdengan benar akan memperluasnya cd \~kernel-ppa/. Bahkan menggunakan cd \dan menekan Tabtidak ada gunanya.

Mengapa begitu dan mengapa saya harus melarikan diri? Selain itu, apa yang saya melarikan diri karena bahkan ~tidak diperlukan untuk ekspansi otomatis?

Jika saya mengikuti arus dan menjalankan cd ~kernoops/dan menekan Enter, status terminal berubah menjadi //:

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

Ini terlihat seperti /direktori, tetapi pwdmengatakan demikian //. Apa itu sebenarnya?

Aditya
sumber
@ RaduRădeanu Baik, ini "/ home / aditya / Downloads / ~ kernel-ppa"
Elliott Frisch
Pertama, "cd ~ kernoops /" membawa Anda ke "cd / home / kernoops /" yang tidak ada. Sebagai gantinya, Anda mendapatkan "cd //" yang merupakan cara lain untuk menulis "cd /" - itu adalah direktori root dari filesystem root, yang memang terlihat aneh.
Elliott Frisch
Mengenai mengapa pelarian tunggal "\\" berfungsi, lihat folder Anda dengan treeatau dengan lsdan Anda akan melihat bahwa itu adalah sub-folder pertama.
Elliott Frisch
@ElliottFrisch: Saya baru memperhatikan bahwa karena itu ~kernel-ppaadalah satu-satunya folder di dalamnya; jika saya hanya menjalankan cd dan tekan tab, itu akan diperluas ke cd \~kernel-ppa/. Saya tidak perlu melarikan diri juga!
Aditya
Iya. Juga, jika Anda terus menekan TAB Anda akan menggilir kelengkapan lain yang tersedia.
Elliott Frisch

Jawaban:

10

Seperti yang Anda ketahui, ~memperluas ke direktori home Anda. Tapi apa yang Anda lewatkan adalah yang ~johnmemperluas ke direktori home dari pengguna bernama "john".

Periksa /etc/passwdfile Anda :

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

Ia memiliki nama "pengguna sistem" kernoops(untuk alasan pelaporan bug internal). Jadi ketika Anda mengetikkan cd ~kTabshell memberikan preferensi (1) untuk ekspansi nama pengguna sebelum ekspansi direktori lokal, dan Anda miliki cd ~kernoops. Sekarang hasilnya adalah dir home user "kernoops" /, jadi cdbegitulah.

Di shell saya zsh,, saya tidak memiliki tebasan ganda (2):

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

Selain itu, nama direktori ini tidak dipikirkan dengan baik. Ini akan membutuhkan tiga perawatan dalam skrip dan apa pun. Satu-satunya ide terburuk yang dapat saya pikirkan adalah menyematkan tab di dalamnya ...


Catatan kaki:

(1) Dalam zsh, bahkan jika saya memiliki direktori bernama ~xdirdan tidak ada pengguna yang memulai dengan x; melakukan cd ~xTabtidak berkembang dan tidak mengutip ~kesalahan give:

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

(2) Saya sepertinya ingat bahwa posix membuat pengecualian untuk inisial //di path --- itu harus dipertahankan karena beberapa varian unix lama (saya menggunakan apolos dengan Domain / OS yang memiliki itu) digunakan //machine-name/...untuk akses tanpa batas ke mesin lain ' filesystem di jaringan lokal (keamanan belum ditemukan). Jadi mungkin bash ada di sini. Jika Anda melakukannya, cd ///Anda akan memiliki normal /di kedua shell.

Ya, ditemukan di unix.se !

Rmano
sumber
1
OS warisan lain yang terkenal menggunakan notasi double-slash seperti itu, tetapi slash-nya biasanya ditulis mundur dan saya tidak yakin apakah ia menerima garis miring ke depan untuk mengakses filesystem jaringan jarak jauh seperti itu. ;-)
R .. GitHub BERHENTI MEMBANTU ICE
7

Karakter tilde ( ~) memiliki makna khusus di shell. Ketika terlihat dalam perintah apa pun, itu diperluas ke nama direktori home Anda. Melakukan cd ~atau cd /home/adityasama, berakhir di direktori home Anda.

Dengan meletakkan karakter backslash ( \) di depan tilde, Anda memberi tahu shell untuk tidak melakukan ekspansi karakter khusus berikut (ini yang disebut shell escape). Dengan melakukan cd \~Anda meminta shell untuk pindah ke direktori yang disebut ~yang akan terletak di bawah direktori yang Anda lakukan perintah. Melakukan hal itu cd \~kernel-ppaakan mengubah Anda ke direktori bernama ~kernel-ppa, yang merupakan perilaku normal.

Diedit: lebih lanjut tentang ~

Jika Anda menulis nama pengguna sistem setelah ~, Anda dipindahkan ke direktori home pengguna itu. Melakukan Tabekspansi setelah cd ~akan diperluas ke nama pengguna yang ada di sistem Anda. Jika Tabselesai setelah cd ~kitu, ia mengembang ke ~ kernoops karena ada pengguna bernama kernoops di pengguna sistem, dengan direktori home dari /. Saat perluasan cd ~khasil cd ~kernoops/dengan garis miring dan direktori home mulai /, Anda dipindahkan ke //. Tapi ini sama persis dengan yang /sudah dikatakan beberapa orang sebelumnya.

Benoit
sumber
Terima kasih atas jawabannya. Kombinasi jawaban Anda dan @Rmano menghapus kebingungan sepenuhnya :)
Aditya