Significado de tilde en Linux bash (no directorio de inicio)

106

En primer lugar, sé que ~/es el directorio de inicio. Grabando ~o ~/me lleva al directorio de inicio.

Sin embargo, cd ~Xme lleva a un lugar especial, donde Xparece haber cualquier cosa.

En bash, si presiono " cd ~" y presiono tabulador, muestra un montón de ~Xopciones posibles como ~maily ~postgresy ~ssh. Ir a esas carpetas y hacer una pwdme muestra que estas carpetas no están en el directorio de inicio; están por todos lados.

No son alias. He comprobado. No son env.variables, de lo contrario requerirían un $.

¿Qué es la configuración de estos enlaces y dónde puedo encontrar dónde se establecen?

jbu
fuente
~ X simplemente devuelve el literal "~ X" pero ~ devuelve $ HOME y ~ + devuelve $ PWD; no son especiales salvo que obtienen variables de shell. es decir, no almacenan los valores ni ejecutan un comando para buscarlos. Ya están definidos. ¿Has probado ~ -? No puedo pensar en un uso para él, pero nuevamente, devuelve una variable de shell $ OLDPWD
SDsolar

Respuestas:

71

Es una función de Bash llamada " expansión de tilde ". Es una función del shell, no del sistema operativo. Obtendrá un comportamiento diferente con csh, por ejemplo.

Para responder a su pregunta sobre de dónde proviene la información: su directorio de inicio proviene de la variable $HOME(sin importar lo que almacene allí), mientras que las casas de otros usuarios se recuperan en tiempo real usando getpwent(). Esta función suele estar controlada por NSS ; por lo tanto, los valores predeterminados se extraen /etc/passwd, aunque se puede configurar para recuperar la información utilizando cualquier fuente deseada, como NIS, LDAP o una base de datos SQL.

La expansión de Tilde es más que una búsqueda en el directorio de inicio. He aquí un resumen:

~              $HOME
~fred          (freds home dir)

~+             $PWD       (your current working directory)
~-             $OLDPWD    (your previous directory)
~1             `dirs +1`
~2             `dirs +2`
~-1            `dirs -1`

dirsy ~1, ~-1, etc., se utilizan en conjunción con pushdy popd.

Tylerl
fuente
como nota, el pez no admite ninguno de ellos, excepto la tilde simple (~)
¿Por qué se les ocurrió ~+? parece bastante inútil.
cregox
3
~ + es aproximadamente lo mismo que. Sin embargo, para usar algo como ./file, tiene que ir al sistema de archivos y averiguar dónde. se encuentra - se necesitan algunos ciclos. El uso de ~ + ahorra el trabajo simplemente devolviendo el contenido de la variable de shell $ PWD que ya está definida a medida que recorre el sistema de archivos.
SDsolar
32

Esos son los directorios de inicio de los usuarios. Prueba cd ~(your username), por ejemplo.

Ana Betts
fuente
1
No son enlaces simbólicos, las cuentas de servicio no tienen directorios de inicio en / home
Ana Betts
La mejor respuesta en mi caso. Además, en mi caso particular, era el directorio / carpeta raíz, no la carpeta de inicio.
wlwl2
16

¿Son los directorios de inicio de los usuarios de /etc/passwd? Servicios como postgres, sendmail, apache, etc., crean usuarios del sistema que tienen directorios de inicio como los usuarios normales.

Sean Bright
fuente
2
De hecho, son ~ nombre de usuario es el directorio de inicio del usuario especificado
Steve Weet
14

Son usuarios. Compruebe su /etc/passwd.

cd ~username lo lleva al directorio de inicio de ese usuario.

Joakim Elofsson
fuente
FTW. Voto a favor. TNX por aclarar eso. Me pregunto cuántos ciclos y quizás incluso una subcapa están involucrados en ese. Imagínese si su sistema tiene 3K usuarios, como en un pequeño ISP. ¡Ay!
SDsolar
9

En mi máquina, debido a la forma en que tengo las cosas configuradas, haciendo:

cd ~             # /work1/jleffler
cd ~jleffler     # /u/jleffler

El primero presta atención al valor de la variable de entorno $HOME; Deliberadamente configuré mi $HOMEen un sistema de archivos local en lugar de un sistema de archivos montado en NFS. El segundo lee del archivo de contraseña (aproximadamente; NIS complica un poco las cosas) y encuentra que el archivo de contraseña dice que mi directorio de inicio es /u/jlefflery cambia a ese directorio.

Lo molesto es que la mayoría del software se comporta como se indicó anteriormente (y la especificación POSIX para el shell requiere este comportamiento). Utilizo algún software (y no tengo muchas opciones sobre su uso) que trata la información del archivo de contraseña como el valor actual de $ HOME, lo cual es incorrecto.

Aplicando esto a la pregunta, como otros han señalado, ' cd ~x' va al directorio de inicio del usuario 'x' y, de manera más general, siempre que se realiza la expansión de tilde, ~xsignifica el directorio de inicio del usuario 'x' (y es un error si el usuario 'x' no existe).


Vale la pena mencionar que:

cd ~-       # Change to previous directory ($OLDPWD)
cd ~+       # Change to current directory ($PWD)

No puedo encontrar un uso inmediato para ' ~+', a menos que haga algunas cosas raras moviendo enlaces simbólicos en la ruta que lleva al directorio actual.

También puedes hacer:

cd -

Eso significa lo mismo que ~-.

Jonathan Leffler
fuente
1
Acerca de cd ~+: potencialmente podría usarlo para verificar si un directorio en el que se encuentra actualmente todavía existe, incluso si es una forma bastante poco ortodoxa de hacerlo.
professorsloth
1

Si está utilizando, autofsentonces la expansión podría provenir de /etc/auto.home(o similar para su distribución). Por ejemplo, mi /etc/auto.masterparece:

/home2 auto.home --timeout 60

y se /etc/auto.homeparece a:

mgalgs -rw,noquota,intr space:/space/mgalgs
Mgalgs
fuente
0

Es posible que vea usuarios de OpenDirectory / ActiveDirectory / LDAP "montados automáticamente" en su directorio de inicio.

En * nix, ~se resolverá en su directorio personal. Asimismo ~Xse resolverá como 'usuario X'.

Similar al montaje automático de directorios, OpenDirectory / ActiveDirectory / LDAP se utiliza en entornos corporativos más grandes para montar automáticamente directorios de usuarios. Estos usuarios pueden ser personas reales o pueden ser cuentas de máquina creadas para proporcionar varias funciones.

Si escribe ~Tab, verá una lista de los usuarios en su máquina.

JS.
fuente