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.