El shell de Bash proporciona algunas variables que tienen el prefijo '~' (llamado tilde) que se denomina Tilde Expansions.
Son sinónimos de contenidos de otras variables dentro de su shell.
La expansión de tilde es el proceso de convertir estas abreviaturas en los nombres de directorio que representan. En este artículo, revisemos la función de expansión de tilde con los ejemplos.
La expansión de tilde se aplica a los caracteres '~' más incluye +, – y N (que es un número entero) hasta espacios en blanco o una barra inclinada .
La expansión de tilde se usa para expandirse a varias rutas específicas:
- Directorios de inicio
- Directorio de trabajo actual/anterior
- Directorios de la pila de directorios.
Directorios de inicio
La expansión Tilde proporciona una forma de expandir el directorio de inicio del usuario actual o el directorio de inicio del nombre de usuario dado.
Syntax ~ Expand to the variable $HOME or home directory of the current user ~USER Expand to the home directory of the given username
Ejemplo 1. Inicio de usuarios actuales
Tilde(~) como una palabra separada, se expande a $HOME si está definido, si $HOME no está definido, entonces se expande con el directorio de inicio del usuario actual.
Ahora el valor de la variable HOME es /home/oracle, por lo que cd ~ cambió el directorio actual al valor de $HOME.
## Logging into a oracle user, whose home directory is /home/oracle # su oracle [tmp]$ pwd /tmp [tmp]$ echo $HOME /home/oracle [tmp]$ cd ~ [~]$ pwd /home/oracle
HOME se cambia a /sbin, y cd ~ usa solo $HOME, no el directorio de inicio del usuario. Después de anular el valor de $HOME, cd ~ cambió el directorio al valor del directorio de inicio establecido para el usuario de Oracle en /etc/passwd. Para la expansión de Tilde, HOME anula el directorio de inicio real.
[~]$ export HOME=/sbin [oracle]$ cd ~ [~]$ pwd /sbin [~]$ unset HOME [sbin]$ cd ~ [oracle]$ pwd /home/oracle
Ejemplo 2. Directorio de inicio del usuario dado
El siguiente script toma la copia de seguridad de un archivo de registro que tiene la fecha actual en el nombre. También registra la hora de inicio y la hora de finalización en el archivo llamado backup.log en el directorio de inicio del usuario de Oracle.
#! /bin/bash echo "Initiating the backup at `date`" >> ~oracle/backup.log da=`date +%F` cp $da.log{,.bak} echo "END BACKUP at `date`" >> ~oracle/backup.log $ ls -l /home/oracle/ total 8 -rw-r--r-- 1 root root 99 Jun 4 14:23 backup.log
Si el nombre de usuario dado no existe, entonces no se expande a algo. En el siguiente ejemplo, no hay ningún usuario llamado ora. Entonces, ~ora no se expandirá a /home/ora.
$ echo ~ora ~ora
Consulte nuestro artículo anterior para comprender cómo realizar la expansión de llaves en bash. es decir, cómo usar { } en bash.
Directorios de trabajo
Tilde con + y - se utilizan para representar los directorios de trabajo.
- ~+ se expande al valor de la variable PWD que contiene el directorio de trabajo actual.
- ~- se expande al valor de la variable OLDPWD, que contiene el directorio de trabajo anterior. Si OLDPWD no está configurado, ~- no se expande.
Ejemplo 3. Expansión de directorios de trabajo antiguos/actuales
El siguiente ejemplo comparará el archivo en el directorio actual y el directorio de trabajo anterior.
$ cat comp.sh #! /bin/bash set -x cd /var/opt/gg if [ -f gg.c ] then echo "File1 exists" fi cd /var/opt1/gg if [ -f gg.c ] then echo "File2 exists" cmp ~+/gg.c ~-/gg.c fi $ ./comp.sh + cd /var/opt/gg + '[' -f gg.c ']' + echo 'File1 exists' File1 exists + cd /var/opt1/gg + '[' -f gg.c ']' + echo 'File2 exists' File2 exists + cmp /var/opt1/gg/gg.c /var/opt/gg/gg.c cmp: EOF on /var/opt1/gg/gg.c $
En la ejecución anterior:
- ~+/gg.c se expande a /var/opt1/gg/gg.c
- ~-/gg.c se expande a /var/opt/gg/gg.c
Este artículo es parte de la serie de tutoriales de Bash en curso.
Expansión para directorios en pila
Cada proceso bash contiene un objeto de pila que se puede usar para realizar un seguimiento de los directorios que visitó un script mientras procesaba los datos del contenido del directorio.
Es un mecanismo muy simple para poder hacer referencia a directorios o volver a cambiar a directorios que uno visitó antes. La expansión Tilde también proporciona expansión a los directorios en la pila de directorios.
- ~+N Expande el directorio N en la pila de directorios (contando desde la izquierda de la lista impresa por dirs cuando se invoca sin opciones), comenzando con cero.
- ~-N Expande el directorio N en la pila de directorios (contando desde la derecha de la lista impresa por dirs cuando se invoca sin opciones), comenzando con cero.
Revise nuestro artículo anterior para comprender cómo usar los comandos dirs, pushd y popd para manipular la pila de directorios.
Ejemplo 4. Muestra el enésimo directorio desde la izquierda usando ~+
En el siguiente ejemplo, la pila de directorios tiene 4 directorios. ~+2 le da la ruta del directorio disponible en la segunda posición desde la izquierda comenzando con cero.
$ dirs -v 0 /sbin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root $ cd ~+2 $ pwd /var/opt/GG/bin
Pero la parte superior de la pila (posición cero) siempre tendrá el directorio actual. Entonces, después de la ejecución anterior, se muestra lo siguiente en la pila de directorios.
$ dirs -v 0 /var/opt/GG/bin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root
Ejemplo 5. Muestra el directorio N desde la derecha usando ~-
Lo siguiente es similar al ejemplo anterior. Pero considerará los directorios desde la parte inferior de la pila debido a ~-.
$ dirs -v 0 /var/opt/GG/bin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root $ cd ~-2 $ pwd /var/opt/midas $ dirs -v 0 /var/opt/midas 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root