Editar: Este es un duplicado de /programming/998626/meaning-of-tilde-in-linux-bash-not-home-directory/ . No tengo la reputación de cerrar esta pregunta como duplicado.
No me refiero ~
como en el directorio de inicio, sino más bien esto:
$ ls ~foo/bar
/some/mount/point/foo/bar
Sin embargo, si lo intento con un punto de montaje diferente, por ejemplo:
$ mount | ag "/dev "
devfs on /dev (devfs, local, nobrowse)
$ ls /dev/stdin
/dev/stdin
$ ls ~stdin
zsh: no such user or named directory: stdin .
# bash has a similar error message:
ls: ~stdin: No such file or directory
¿Cómo se ~
llama en este contexto? ¿Como funciona?
Editar: más información basada en algunos de los comentarios a continuación:
- Puedo dar fe de que
foo
no es un nombre de usuario en mi sistema. - Al intentar completar automáticamente,
ls -lah ~
no se muestran todas las opciones. es decir, puedocd ~qux
, cuandoqux
no aparece en el autocompletado. De nuevoqux
no es un usuario en mi sistema. - Si importa
/some/mount/point
es un recurso compartido de red. - Todos los detalles sugieren alguna ruina de ruta con nombre, una característica de Z shell de expansión de nombre de ruta, pero esto también funciona en bash, que aparentemente no admite cosas como las rutas con nombre de Z shell.
~foo
es el directorio de inicio del usuariofoo
. Si no se especifica el usuario, el usuario actual es el predeterminado./some/mount/point
definitivamente no es mi directorio personal.cd ~
me lleva a/Users/$username/
partidos --que$HOME
zsh
parece utilizar también la tilde para indicar directorios con nombre.bash -c "ls ~foo/bar"
), que no tiene directorios con nombre. Además, incluso dentro de zsh, si inspecciono elenv
, no veo ningún directorio con nombre configurado. Estoy en Mac OS y siento que esta es una característica específica de OS X.~foo
. Tome la cadena real (no el ejemplofoo
) y hagagrep "actual username" /etc/passwd
.~text
debería funcionar solo para posibles nombres de usuario de inicio de sesión de acuerdo con el manual de bash (no necesariamente significa que realmente pueda iniciar sesión; en el caso de usuarios del sistema como~lp
, por ejemplo). En todas mis pruebas,~string
corresponde constring
ser nombre de usuario.Respuestas:
¿Qué es ~ foo
Cita del manual de bash (con énfasis adicional):
~foo
se expande alfoo
directorio de inicio del usuario exactamente como se especifica en/etc/passwd
. Tenga en cuenta que esto puede incluir nombres de usuario del sistema; no necesariamente significa usuarios humanos o que realmente pueden iniciar sesión localmente (por ejemplo, pueden iniciar sesión a través de claves SSH).De hecho, como se señaló en los comentarios ,
bash
utilizará lagetpwnam
función. Esa función en sí es especificado por POSIX estándar, por lo tanto, debe existir en más sistemas similares a Unix, incluyendo MacOS X . Esta función no se limita/etc/passwd
solo a búsquedas en otras bases de datos, como LDAP y NIS. Extracto particular delbash
código fuente ,tilde.c
archivo, comenzando en la línea 394:Ejemplo práctico
A continuación puede ver las pruebas con los nombres de usuario del sistema en mi sistema. Preste atención a la
passwd
entrada correspondiente y al resultado dels ~username
Incluso si, por ejemplo, la
_apt
cuenta está bloqueada como lo sugiere la salidapasswd -S apt
, todavía se muestra como posible nombre de inicio de sesión:Tenga en cuenta: esta no es una característica específica de macOS, sino una característica específica de shell.
fuente
/etc/shadow
junto con la otra información de autenticación protegida, como la contraseña. La referencia enpasswd
se trata de invalidar la contraseña: eso no impediría la autenticación por otros medios.testuser
y modificando la fecha de vencimiento de la contraseña. El nombre de usuario todavía aparece al completar la pestaña. He eliminado esa parte de la respuestabash
página de manual (al parecer, la anterior). El OP realmente está usandozsh
(podría haber sido más claro), aunque en los comentarios se menciona quebash
tiene el mismo comportamiento.getent passwd foo
lugar degrep foo /etc/password
seguir los mismos mecanismos de búsqueda que el shell, tal vez incluyendo servicios de directorio basados en la red que @Abigail menciona.En resumen de por qué está viendo algo
~foo/bar
, es porque tiene un usuario nombradofoo
en el sistema con una carpeta nombradabar
en su directorio de inicio.Vea esta solución en otra comunidad que explica por qué (tilde)
~
es más que solo "directorio de inicio".Si tiene un usuario nombrado
bin
en su sistema, puede enumerar los contenidos del directorio de inicio de bin mediante el comando:ls ~bin
Otra cosa que puede intentar es usar la finalización de tabulación después de escribir lo siguiente en un indicador (no devuelva el carro, solo use la tecla tab):
ls -lah ~
tabpara ver la lista de directorios de inicio de los usuarios que
~
se expandirán si continúa. Ejemplo de salida (truncada) de completar la pestaña dels -lah ~
tabfuente
/etc/passwd
. Inmediatamente ayuda a aclarar qué sucede si el usuario, por supuesto, conoce los nombres de usuario que tiene en el sistema.~foo
completó automáticamente, puedo dar fe de quefoo
no es un usuario en mi sistema (y de hecho no existe/etc/passwd
). Además, todas las carpetas / archivos/some/mount/point
aparecen en el autocompletado, lo cual es muy interesante.