Cómo expandir manualmente una variable especial (ej: ~ tilde) en bash
Tengo una variable en mi script bash cuyo valor es algo como esto:
~/a/b/c
Tenga en cuenta que es una tilde no expandida. Cuando hago ls -lt en esta variable (llámela $VAR), no obtengo ese directorio. Quiero dejar que bash interprete/expanda esta variable sin ejecutarla. En otras palabras, quiero que bash ejecute eval pero no ejecute el comando evaluado. ¿Es esto posible en bash?
¿Cómo logré pasar esto a mi script sin expansión? Pasé el argumento rodeándolo entre comillas dobles.
Pruebe este comando para ver a qué me refiero:
ls -lt "~"
Esta es exactamente la situación en la que me encuentro. Quiero que se expanda la tilde. En otras palabras, ¿con qué debo reemplazar la magia para que estos dos comandos sean idénticos?
ls -lt ~/abc/def/ghi
y
ls -lt $(magic "~/abc/def/ghi")
Tenga en cuenta que ~/abc/def/ghi puede existir o no.
Si la variable var
es ingresada por el usuario, noeval
se debe usar para expandir la tilde usando
eval var=$var # Do not use this!
La razón es: el usuario podría escribir por accidente (o por propósito), por ejemplo, var="$(rm -rf $HOME/)"
con posibles consecuencias desastrosas.
Una forma mejor (y más segura) es utilizar la expansión de parámetros de Bash:
var="${var/#\~/$HOME}"
Debido a la naturaleza de StackOverflow, no puedo simplemente hacer que esta respuesta no sea aceptada, pero en los 5 años transcurridos desde que publiqué esto ha habido respuestas mucho mejores que mi respuesta ciertamente rudimentaria y bastante mala (era joven, no mates a mí).
Las otras soluciones en este hilo son mejores y más seguras. Preferiblemente, elegiría cualquiera de estos dos:
- La solución de Charles Duffy
- La solución de Håkon Hægland
Respuesta original para fines históricos (pero no utilice esto)
Si no me equivoco, "~"
un script bash no lo expandirá de esa manera porque se trata como una cadena literal "~"
. Puedes forzar la expansión de eval
esta manera.
#!/bin/bash
homedir=~
eval homedir=$homedir
echo $homedir # prints home path
Alternativamente, utilícelo ${HOME}
si desea el directorio de inicio del usuario.