Finalización inesperada de Bash de ~ en OS X

13

Presioné ~TabTabel símbolo del sistema bash y obtuve un conjunto inesperado de finalizaciones.

Primero se parecía a todas las personas en el /Usersdirectorio, y mucho más.

Luego pensé que estaba haciendo la búsqueda inversa de personas con directorios de "inicio" /etc/password, o tal vez los que estaban /var/empty, esto parece correcto.

Lo que tengo curiosidad acerca de lo que realmente está sucediendo y por qué esto funciona como lo hace.

Walt Stoneburner
fuente

Respuestas:

21

No tengo un sistema OSX a mano para verificar, pero en todos los * nixes, ~fooes una abreviatura del directorio de inicio del usuario foo. Por ejemplo, este comando se moverá a mi usuario $HOME( cd ~solo se moverá a su directorio de inicio):

cd ~terdon

Por lo tanto, ~y Tabse expandirá a todos los posibles nombres de usuario. La lista debe ser la misma que la lista de usuarios en /etc/passwd.

Puedo confirmar que eso es exactamente lo que sucede cuando intento esto en mi Debian.

terdon
fuente
Es lo mismo cuando lo pruebo en FreeBSD.
Jenny D
Entonces, lo que me sorprendió fue que no tenía directorios en / home para esos usuarios. De hecho, muchos dijeron / var / empty. Me imaginé que tales finalizaciones se realizaban por búsqueda de disco, por lo que ~ estaría mirando el directorio de inicio real en el disco en lugar de las entradas / etc / passwd. Porque ~ realmente significa "directorio de inicio de un usuario" y no realmente un acceso directo para / home (o / User), la expansión hace referencia a / var / empty en mi caso de OS X. ¡Aprendí algo nuevo! ¡Gracias!
Walt Stoneburner
La respuesta de @WaltStoneburner fdo a continuación sugiere que OSX está haciendo algo diferente, no lo sé. En Linux, de todos modos, crear un directorio en /homees irrelevante, eso no hará que aparezca un nuevo nombre de usuario. Además, tenga en cuenta que no todos los $ HOMEs de los usuarios están en /home(o /Users).
terdon
@terdon - Creo que lo lograste con tu respuesta. En mi cuenta de Linux tengo un usuario dovenull que tiene un directorio falso de / nonexistent, aparece en el autocompletado, pero el comando cd falla (como se esperaba).
Walt Stoneburner
2

Pensé que estaba haciendo la búsqueda inversa de personas con directorios "home" en / etc / password.

En OS X, se consulta Open Directory en lugar de / etc / passwd.

fd0
fuente
1

El Manual de referencia de Bash dice :

Bash intenta completar el tratamiento del texto como nombre de usuario (si el texto comienza con '~')

Bash utiliza la getpwent función para completar.

man getpwent en OSX dice:

Estas funciones obtienen información de opendirectoryd (8), incluidos los registros en /etc/master.passwd que se describe en master.passwd (5).

Evgeny Vereshchagin
fuente