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

8

Ho una cartella denominata ~kernel-ppa all'interno di ~/Downloads .

[email protected]:~$ cd Downloads/
[email protected]:~/Downloads$ ls
~kernel-ppa

Ora quando digito cd ~k e premo Tab per l'espansione automatica, la shell lo espande a cd ~kernoops/ invece di cd ~kernel-ppa/ sebbene la cartella con gli stessi caratteri iniziali sia già presente.

Perché l'espansione automatica funzioni, ho bisogno di scappare con \ . Quindi, usando cd \~k e premendo Tab lo si espande correttamente in cd \~kernel-ppa/ . Anche usare cd \ e premere Tab fa il trucco.

Perché è così e perché devo fuggire? Inoltre, che cosa sto sfuggendo perché nemmeno ~ non è richiesto per l'espansione automatica?

Se vado con il flusso ed eseguo cd ~kernoops/ e preme Invio , lo stato del terminale cambia in // :

[email protected]:~/Downloads$ cd ~kernoops/
[email protected]://$ pwd
//
[email protected]://$ 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
[email protected]://$ 

Sembra la directory / , ma pwd dice che è // . Che cos'è esattamente?

    
posta Aditya 02.04.2014 - 15:30

2 risposte

10

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

Controlla il tuo file /etc/passwd :

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

Ha un "utente di sistema" chiamato kernoops (per ragioni interne di segnalazione di bug). Quindi quando scrivi cd ~k Tab la shell dà preferenza (1) all'espansione del nome utente prima dell'espansione delle directory locali, e tu hai cd ~kernoops . Ora risulta che l'utente "kernoops" home dir è / , quindi cd s ad esso.

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

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

Per inciso, questo nome di directory non è ben pensato. Avrà bisogno di cure triple negli script e qualsiasi altra cosa. L'unica idea peggiore che posso pensare è incorporare una scheda in esso ...

Note:

(1) In zsh , anche se ho una directory denominata ~xdir e nessun utente che inizia con x ; facendo cd ~x Tab non si espande e non si cita il ~ dà errore:

[:~/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é alcune vecchie varianti unix (ho usato il apollos con Domain / OS che aveva quello) usato //machine-name/... per accedere senza problemi al filesystem di altre macchine nella rete locale (la sicurezza non era ancora stata inventata). Quindi probabilmente bash è proprio qui. Se fai cd /// avrai il normale / in entrambe le shell, però.

Sì, trovato su unix.se !

    
risposta data Rmano 02.04.2014 - 16:03
7

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

Inserendo un carattere barra rovesciata ( \ ) davanti alla tilde, dici alla shell di non eseguire l'espansione del seguente carattere speciale (questo è ciò che viene chiamato shell escape). Facendo cd \~ chiedi alla shell di spostarsi in una directory chiamata ~ che si troverà nella directory in cui stai eseguendo il comando. Così facendo cd \~kernel-ppa ti cambierà nella directory chiamata ~kernel-ppa , che è il comportamento normale.

MODIFICA: altro su ~

Se scrivi un nome utente del tuo sistema dopo ~ , verrai spostato nella directory home di quell'utente. L'espansione di una scheda dopo cd ~ si espanderà nei nomi utente esistenti sul tuo sistema. Se esegui il completamento di Tab dopo cd ~k , si espande in ~ kernoops perché vi è un utente chiamato kernoops nell'utente di sistema, con una directory home di / . Poiché l'espansione di cd ~k si traduce in cd ~kernoops/ con una barra finale e la directory home che sta per / , sei spostato su // . Ma questo è esattamente lo stesso di / di quanto qualcuno abbia già detto prima.

    
risposta data Benoit 02.04.2014 - 15:54

Leggi altre domande sui tag