¿Por qué cd ~ k (& tab) se expande a cd ~ kernoops cuando ya tengo una carpeta llamada "~ kernel-ppa" en pwd?

8

Tengo una carpeta llamada ~kernel-ppadentro ~/Downloads.

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

Ahora, cuando escribo cd ~ky presiono Tabpara la expansión automática, el shell lo expande en cd ~kernoops/lugar de cd ~kernel-ppa/aunque la carpeta con los mismos caracteres iniciales ya está presente.

Para que funcione la expansión automática, necesito escapar con ella \. Por lo tanto, usar cd \~ky presionar Tabcorrectamente lo expande a cd \~kernel-ppa/. Incluso usar cd \y presionar Tabhace el truco.

¿Por qué es así y por qué necesito escapar? Además, ¿de qué estoy escapando ya que incluso ~no es necesario para la expansión automática?

Si voy con el flujo y corro cd ~kernoops/y presiono Enter, el estado del terminal cambia a //:

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

Esto se parece al /directorio, pero pwddice que lo es //. ¿Qué es exactamente?

Aditya
fuente
@ RaduRădeanu Tampoco, es "/ home / aditya / Downloads / ~ kernel-ppa"
Elliott Frisch
Primero, "cd ~ kernoops /" te lleva a "cd / home / kernoops /" que no existe. En su lugar, obtienes "cd //", que es otra forma de escribir "cd /": es el directorio raíz del sistema de archivos raíz, que parece extraño.
Elliott Frisch
En cuanto a por qué funciona el escape único "\\", eche un vistazo a su carpeta con treeo con lsy notará que es la primera subcarpeta.
Elliott Frisch
@ElliottFrisch: Acabo de notar que ya que ~kernel-ppaes la única carpeta dentro de ella; si solo ejecuto cd y presiono tab, se expande a cd \~kernel-ppa/. ¡No necesito escapar también!
Aditya
Si. Además, si sigue presionando TAB, pasará por otras terminaciones disponibles.
Elliott Frisch

Respuestas:

10

Como sabes, se ~expande a tu directorio de inicio. Pero lo que parece haberse perdido es que se ~johnexpande al directorio de inicio del usuario llamado "john".

Revisa tu /etc/passwdarchivo:

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

Tiene un "usuario del sistema" llamado kernoops(por razones de informes de errores internos). Entonces, cuando escribe cd ~kTabel shell, da preferencia (1) a la expansión del nombre de usuario antes de la expansión de directorios locales, y usted tiene cd ~kernoops. Ahora resulta que el directorio de inicio de "kernoops" del usuario es /, así que cdestá listo .

En mi caparazón, zshno tengo doble barra (2):

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

Por otro lado, este nombre de directorio no está bien pensado. Necesitará el triple cuidado en los scripts y lo que sea. La única peor idea que puedo pensar es incrustar una pestaña en ella ...


Notas al pie:

(1) En zsh, incluso si tengo un directorio llamado ~xdiry ningún usuario comienza con x; haciendo cd ~xTabno se expande y no citando el ~error dado :

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

(2) Me parece recordar que posix hizo una excepción para la inicial //en una ruta --- debe mantenerse porque alguna variante antigua de Unix (usé los apolos con Domain / OS que tenía eso) //machine-name/...para acceder sin problemas a otras máquinas ' sistema de archivos en la red local (la seguridad aún no se inventó). Entonces probablemente bash esté aquí. Sin embargo, si lo hace cd ///, tendrá la normalidad /en ambos shell.

Sí, encontrado en unix.se !

Rmano
fuente
1
Otro sistema operativo heredado conocido usa la notación de doble barra como esa, pero sus barras generalmente se escriben al revés y no estoy seguro de si acepta barras diagonales para acceder a sistemas de archivos remotos de red como ese. ;-)
R .. GitHub DEJA DE AYUDAR AL HIELO
7

El carácter tilde ( ~) tiene un significado especial en el shell. Cuando se ve en cualquier comando, se expande al nombre de su directorio de inicio. Haciendo cd ~o cd /home/adityaes lo mismo, termina en su directorio de inicio.

Al poner un carácter de barra diagonal inversa ( \) delante de la tilde, le dice al shell que no realice la expansión del siguiente carácter especial (esto es lo que se llama escape de shell). Al hacerlo, cd \~le pide al shell que se mueva a un directorio llamado ~que se ubicaría debajo del directorio donde está ejecutando el comando. Hacerlo cd \~kernel-ppate cambiará al directorio llamado ~kernel-ppa, que es el comportamiento normal.

EDITADO: más sobre ~

Si escribe un nombre de usuario de su sistema después de ~, se lo traslada al directorio de inicio de ese usuario. Hacer una Tabexpansión después cd ~se expandirá a los nombres de usuario existentes en su sistema. Si se Tabcompleta después cd ~k, se expande a ~ kernoops porque hay un usuario llamado kernoops en el usuario del sistema, con un directorio de inicio de /. A medida que se expanden los cd ~kresultados cd ~kernoops/con una barra inclinada final y el directorio de inicio /, se le traslada a //. Pero esto es estrictamente lo mismo /que otros ya dijeron anteriormente.

Benoit
fuente
Gracias por la respuesta. La combinación de las respuestas tuyas y @Rmano despeja la confusión por completo :)
Aditya