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
foono 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, cuandoquxno aparece en el autocompletado. De nuevoquxno es un usuario en mi sistema. - Si importa
/some/mount/pointes 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.

~fooes el directorio de inicio del usuariofoo. Si no se especifica el usuario, el usuario actual es el predeterminado./some/mount/pointdefinitivamente no es mi directorio personal.cd ~me lleva a/Users/$username/partidos --que$HOMEzshparece 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.~textdeberí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,~stringcorresponde constringser nombre de usuario.Respuestas:
¿Qué es ~ foo
Cita del manual de bash (con énfasis adicional):
~foose expande alfoodirectorio 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 ,
bashutilizará lagetpwnamfunció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/passwdsolo a búsquedas en otras bases de datos, como LDAP y NIS. Extracto particular delbashcódigo fuente ,tilde.carchivo, 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
passwdentrada correspondiente y al resultado dels ~usernameIncluso si, por ejemplo, la
_aptcuenta 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/shadowjunto con la otra información de autenticación protegida, como la contraseña. La referencia enpasswdse trata de invalidar la contraseña: eso no impediría la autenticación por otros medios.testusery 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 respuestabashpá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 quebashtiene el mismo comportamiento.getent passwd foolugar degrep foo /etc/passwordseguir 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 nombradofooen el sistema con una carpeta nombradabaren 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
binen su sistema, puede enumerar los contenidos del directorio de inicio de bin mediante el comando:ls ~binOtra 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.~foocompletó automáticamente, puedo dar fe de quefoono es un usuario en mi sistema (y de hecho no existe/etc/passwd). Además, todas las carpetas / archivos/some/mount/pointaparecen en el autocompletado, lo cual es muy interesante.