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?
fuente

treeo conlsy notará que es la primera subcarpeta.~kernel-ppaes la única carpeta dentro de ella; si solo ejecutocdy presiono tab, se expande acd \~kernel-ppa/. ¡No necesito escapar también!Respuestas:
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:Tiene un "usuario del sistema" llamado
kernoops(por razones de informes de errores internos). Entonces, cuando escribecd ~kTabel shell, da preferencia (1) a la expansión del nombre de usuario antes de la expansión de directorios locales, y usted tienecd ~kernoops. Ahora resulta que el directorio de inicio de "kernoops" del usuario es/, así quecdestá listo .En mi caparazón,
zshno tengo doble barra (2):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 conx; haciendocd ~xTabno se expande y no citando el~error dado :(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 hacecd ///, tendrá la normalidad/en ambos shell.Sí, encontrado en unix.se !
fuente
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. Haciendocd ~ocd /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. Hacerlocd \~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éscd ~se expandirá a los nombres de usuario existentes en su sistema. Si se Tabcompleta despuéscd ~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 loscd ~kresultadoscd ~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.fuente