~ es $HOME, pero ¿a veces?

~ es $HOME, pero ¿a veces?

discos compactos ~

hace lo mismo que

cd $HOME

que también es lo mismo que

cd /home/tandu

Sin embargo,

cd ~not-tandu

cambios a/home/not-tandu

¿Es esto una elección puramente sintáctica? ¿Cómo maneja esto el kernel (o el cdejecutable)? ¿Existe un caso especial para ~agregar la barra si se omite todo lo demás? Es decir, ~/y ~cambia al mismo directorio, pero ~aestá un directorio arriba. No se puede decir lo mismo de ningún otro directorio al que cambie.

Respuesta1

~es un alias $HOMEproporcionado por varios shells, pero $HOMEes más universal. $HOMEen realidad le pide al shell que inserte (sustituya) la variable ambiental HOME aquí. Hay una gran cantidad de variables ambientales diferentes que se pueden sustituir; intente envbuscar una lista. Tenga en cuenta que ~no siempre se reconoce cuando no está al principio de una palabra. Pruebe estos dos comandos para comparar:

ls /~
ls /$HOME

El primero se pasa al ejecutable ls /~que luego intenta buscar un archivo llamado ~en el directorio raíz, el segundo se expande $HOMEy se convierte en //home/userel que luego se pasa al ejecutable ls como argumento de línea de comandos. Todos los sistemas POSIX (POSIX es el estándar de funcionamiento de los sistemas UNIX y Linux) permiten que varias barras diagonales se traten igual que una sola barra, por lo que //home/useres lo mismo que decir /home/user. ~usernamees un atajo para decirle al shell que busque el nombre de usuario en el archivo passwd y devuelva su directorio de inicio. No existe una variable de entorno equivalente. Todas estas sustituciones las realiza el shell y son compatibles con la mayoría de ellas, pero $HOMEse garantiza que todos los shells solo admiten variables de entorno como. Además, cden realidad es un comando integrado. Es una directiva especial que le dice al shell que cambie de directorio. No es como otras funciones integradas del shell que se pueden implementar como un ejecutable separado, echoporque se usa para cambiar un atributo fundamental del proceso del shell. echoes simplemente un shell integrado por razones de rendimiento, pero en los viejos tiempos de UNIX, solo estaba disponible como su propio ejecutable /bin/echo.

Respuesta2

~foosignifica 'el directorio de inicio del usuario foo'.

Esto no lo hace el kernel, sino que lo interpreta el shell. Siempre que el shell lo ve ~foocomo un argumento, lo reemplaza de forma transparente con el directorio de inicio del usuario fooy lo pasa en su lugar. Entonces, cuando ejecuta cd ~tandu, el shell realmente se está ejecutando cd /home/tandu.

Respuesta3

~seguido de un nombre de usuario se expande al directorio de inicio de ese usuario.

información relacionada