Pourquoi cd ~ k (& tab) se développe-t-il en cd ~ kernoops alors que j'ai déjà un dossier nommé "~ kernel-ppa" dans pwd?

8

J'ai un dossier nommé à l' ~kernel-ppaintérieur ~/Downloads.

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

Maintenant, lorsque je tape cd ~ket appuie sur Tabpour l'expansion automatique, le shell le développe au cd ~kernoops/lieu de cd ~kernel-ppa/bien que le dossier avec les mêmes caractères de départ soit déjà présent.

Pour que l'expansion automatique fonctionne, je dois y échapper \. Ainsi, le fait d'utiliser cd \~ket d'appuyer Tabcorrectement le développe cd \~kernel-ppa/. Même l'utilisation cd \et la pression Tabfont l'affaire.

Pourquoi en est-il ainsi et pourquoi dois-je m'échapper? De plus, qu'est-ce que j'échappe puisque même ~n'est pas requis pour l'expansion automatique?

Si je continue avec le flux et que j'exécute cd ~kernoops/et que j'appuie sur Enter, l'état du terminal devient //:

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

Cela ressemble au /répertoire, mais pwddit qu'il l'est //. C'est quoi exactement?

Aditya
la source
@ RaduRădeanu Ni l'un ni l'autre, c'est "/ home / aditya / Downloads / ~ kernel-ppa"
Elliott Frisch
Tout d'abord, "cd ~ kernoops /" vous amène à "cd / home / kernoops /" qui n'existe pas. Au lieu de cela, vous obtenez "cd //" qui est une autre façon d'écrire "cd /" - c'est le répertoire racine du système de fichiers racine, qui semble étrange.
Elliott Frisch
Quant à savoir pourquoi le seul d'échappement "\\" fonctionne, jetez un œil à votre dossier avec treeou avec lset vous remarquerez que c'est le premier sous-dossier.
Elliott Frisch
@ElliottFrisch: Je viens de remarquer que puisque ~kernel-ppac'est le seul dossier à l'intérieur; si je viens d'exécuter cd et d'appuyer sur tab, il se développe cd \~kernel-ppa/. Je n'ai pas besoin de m'échapper aussi!
Aditya
Oui. De plus, si vous continuez à appuyer sur TAB, vous parcourrez les autres finitions disponibles.
Elliott Frisch

Réponses:

10

Comme vous le savez, se ~développe dans votre répertoire personnel. Mais ce que vous semblez avoir manqué, c'est qu'il se ~johndéveloppe dans le répertoire personnel de l'utilisateur nommé "john".

Vérifiez votre /etc/passwddossier:

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

Il a un "utilisateur système" nommé kernoops(pour des raisons internes de rapport de bogue). Ainsi, lorsque vous tapez cd ~kTable shell, vous donnez la préférence (1) à l'expansion du nom d'utilisateur avant l'expansion des répertoires locaux, et vous l'avez cd ~kernoops. Maintenant, il en résulte que le répertoire personnel de l'utilisateur "kernoops" est /, donc c'est cdà lui.

Dans ma coquille, zshje n'ai pas de double barre oblique (2):

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

Soit dit en passant, ce nom de répertoire n'est pas bien pensé. Il aura besoin d'un triple soin dans les scripts et autres. La seule pire idée que je puisse penser est d'y insérer un onglet ...


Notes de bas de page:

(1) Dans zsh, même si j'ai un répertoire nommé ~xdiret aucun utilisateur ne commence par x; faire cd ~xTabne se développe pas et ne cite pas l' ~erreur donne:

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

(2) Je semble me souvenir que le posix a fait une exception pour l'initiale //dans un chemin --- il devrait être maintenu parce qu'une vieille variante unix (j'ai utilisé les apollos avec Domain / OS qui en disposaient) //machine-name/...pour accéder en toute transparence à d'autres machines '' système de fichiers dans le réseau local (la sécurité n'a pas encore été inventée). Donc, bash est probablement ici. Si vous le faites, cd ///vous aurez cependant la normale /dans les deux coques.

Oui, trouvé sur unix.se !

Rmano
la source
1
Un autre système d'exploitation bien connu utilise une notation à double barre oblique comme celle-ci, mais ses barres obliques sont généralement écrites à l'envers et je ne suis pas certain s'il accepte les barres obliques pour accéder à des systèmes de fichiers distants du réseau comme celui-ci. ;-)
R .. GitHub STOP HELPING ICE
7

Le caractère tilde ( ~) a une signification particulière dans le shell. Lorsqu'il apparaît dans n'importe quelle commande, il est étendu au nom de votre répertoire personnel. Faire cd ~ou cd /home/adityac'est la même chose, il se retrouve dans votre répertoire personnel.

En plaçant un caractère barre oblique inverse ( \) devant le tilde, vous dites au shell de ne pas faire l'expansion du caractère spécial suivant (c'est ce que l'on appelle l'échappement du shell). En faisant cela, cd \~vous demandez au shell de se déplacer vers un répertoire appelé ~qui serait situé sous le répertoire dans lequel vous exécutez la commande. Ainsi cd \~kernel-ppa, vous passerez au répertoire appelé ~kernel-ppa, qui est le comportement normal.

EDITÉ: plus sur ~

Si vous écrivez un nom d'utilisateur de votre système après le ~, vous êtes déplacé vers le répertoire personnel de cet utilisateur. Faire une Tabextension après cd ~étendra aux noms d'utilisateurs existants sur votre système. Si vous terminez Tabaprès cd ~k, il se développe en ~ kernoops car il y a un utilisateur nommé kernoops dans l'utilisateur système, avec un répertoire personnel de /. Comme l'expansion des cd ~krésultats cd ~kernoops/avec une barre oblique de fin et le répertoire personnel étant /, vous êtes déplacé vers //. Mais c'est strictement le même /que certains autres l'ont déjà dit plus tôt.

Benoit
la source
Merci d'avoir répondu. La combinaison des vôtres et des réponses de @ Rmano efface complètement la confusion :)
Aditya