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?


@ 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 !


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.


Terima kasih atas jawabannya. Kombinasi jawaban Anda dan @Rmano menghapus kebingungan sepenuhnya :)
— Aditya
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.