Tengo una carpeta llamada ~kernel-ppa
dentro ~/Downloads
.
aditya@aditya-desktop:~$ cd Downloads/
aditya@aditya-desktop:~/Downloads$ ls
~kernel-ppa
Ahora, cuando escribo cd ~k
y 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 \~k
y 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 pwd
dice que lo es //
. ¿Qué es exactamente?
fuente
tree
o conls
y notará que es la primera subcarpeta.~kernel-ppa
es la única carpeta dentro de ella; si solo ejecutocd
y 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~john
expande al directorio de inicio del usuario llamado "john".Revisa tu
/etc/passwd
archivo:Tiene un "usuario del sistema" llamado
kernoops
(por razones de informes de errores internos). Entonces, cuando escribecd ~k
Tabel 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í quecd
está listo .En mi caparazón,
zsh
no 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~xdir
y ningún usuario comienza conx
; haciendocd ~x
Tabno 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/aditya
es 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-ppa
te 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 ~k
resultadoscd ~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