Perché cd ~ k (& tab) si espande in cd ~ kernoops quando ho già una cartella chiamata “~ kernel-ppa” in pwd?


8

Ho una cartella chiamata ~kernel-ppadentro ~/Downloads.

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

Ora quando scrivo cd ~ke premo Tabper l'espansione automatica, la shell lo espande cd ~kernoops/invece che cd ~kernel-ppa/sebbene sia già presente la cartella con gli stessi caratteri iniziali.

Affinché l'espansione automatica funzioni, devo evitarlo \. Quindi l'utilizzo cd \~ke la pressione Tabcorretta lo espande a cd \~kernel-ppa/. Anche usando cd \e premendo Tabfa il trucco.

Perché è così e perché devo scappare? Inoltre, cosa sto scappando poiché ~non è nemmeno necessario per l'espansione automatica?

Se seguo il flusso, corro cd ~kernoops/e premo Enter, lo stato del terminale cambia in //:

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

Questa sembra la /directory, ma pwddice che lo è //. Che cosa è esattamente?


@ RaduRădeanu Né è "/ home / aditya / Download / ~ kernel-ppa"
Elliott Frisch

Innanzitutto, "cd ~ kernoops /" ti porta a "cd / home / kernoops /" che non esiste. Invece, ottieni "cd //" che è un altro modo di scrivere "cd /" - è la directory principale del filesystem di root, che sembra strana.
Elliott Frisch

Per quanto riguarda il motivo per cui la singola escape "\\" funziona, dai un'occhiata alla tua cartella con treeo con lse noterai che sembra essere la prima sottocartella.
Elliott Frisch

@ElliottFrisch: ho appena notato che poiché ~kernel-ppaè l'unica cartella al suo interno; se corro cd e premo tab, si espande a cd \~kernel-ppa/. Non ho bisogno di scappare anch'io!
Aditya,

Sì. Inoltre, se continui a premere TAB, scorrerai tra gli altri completamenti disponibili.
Elliott Frisch

Risposte:


10

Come sai, si ~espande nella tua home directory. Ma quello che sembra esserti perso è che si ~johnespande nella home directory dell'utente chiamato "john".

Controlla il tuo /etc/passwdfile:

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

Ha un "utente di sistema" chiamato kernoops(per motivi di segnalazione di bug interni). Quindi, quando si digita cd ~kTabla shell, si dà la preferenza (1) all'espansione del nome utente prima dell'espansione delle directory locali cd ~kernoops. Ora risulta che la home directory "kernoops" dell'utente lo è /, quindi lo cdè.

Nella mia shell, zshnon ho una doppia barra (2):

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

A parte questo nome di directory non è ben pensato. Avrà bisogno di una tripla cura negli script e quant'altro. L'unica peggior idea che posso pensare è incorporare una scheda in esso ...


Note:

(1) In zsh, anche se ho una directory chiamata ~xdire nessun utente che inizia con x; fare cd ~xTabnon si espande e non cita l' ~errore dà:

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

(2) Mi sembra di ricordare che posix ha fatto un'eccezione per l'iniziale //in un percorso --- dovrebbe essere mantenuto perché una vecchia variante unix (ho usato gli apollo con dominio / sistema operativo che lo avevano) usato //machine-name/...per accedere senza problemi ad altre macchine " filesystem nella rete locale (la sicurezza non è stata ancora inventata). Quindi probabilmente Bash è proprio qui. Se lo fai cd ///avrai comunque il normale /in entrambe le shell.

Sì, trovato su unix.se !


1
Un altro sistema operativo legacy ben noto utilizza questa notazione a doppia barra come quella, ma le sue barre sono in genere scritte al contrario e non sono sicuro se accetta barre in avanti per accedere a file system di rete come quello. ;-)
R .. GitHub FERMA AIUTANDO ICE

7

Il carattere tilde ( ~) ha un significato speciale nella shell. Quando viene visualizzato in qualsiasi comando, viene espanso nel nome della home directory. Fare cd ~o cd /home/adityaè lo stesso, finisce nella tua home directory.

Mettendo un carattere barra rovesciata ( \) davanti alla tilde, dici alla shell di non fare l'espansione del seguente carattere speciale (questo è ciò che viene chiamato shell escape). Facendo ciò cd \~chiedi alla shell di passare a una directory chiamata ~che si troverebbe sotto la directory che stai eseguendo il comando. Così facendo cd \~kernel-ppati cambierà nella directory chiamata ~kernel-ppa, che è il comportamento normale.

EDITED: ulteriori informazioni su ~

Se si scrive un nome utente del proprio sistema dopo il ~, si viene spostati nella home directory dell'utente. Fare Tabun'espansione dopo cd ~si espanderà ai nomi utente esistenti sul sistema. Se Tabdopo il completamento cd ~k, si espande in ~ kernoops perché l'utente di sistema ha nome kernoops , con una home directory di /. Mentre l'espansione dei cd ~krisultati avviene cd ~kernoops/con una barra finale e la home directory inizia /, si viene spostati in //. Ma questo è esattamente lo stesso di quello /che alcuni fratelli hanno già detto prima.


Grazie per la risposta. La combinazione delle tue risposte e di @ Rmano cancella completamente la confusione :)
Aditya,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.