Cómo expandir manualmente una variable especial (ej: ~ tilde) en bash

Resuelto madiyaan damha asked hace 13 años • 19 respuestas

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.

madiyaan damha avatar Oct 19 '10 04:10 madiyaan damha
Aceptado

Si la variable vares 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}"
Håkon Hægland avatar Dec 15 '2014 13:12 Håkon Hægland

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 evalesta manera.

#!/bin/bash

homedir=~
eval homedir=$homedir
echo $homedir # prints home path

Alternativamente, utilícelo ${HOME}si desea el directorio de inicio del usuario.

wkl avatar Oct 18 '2010 21:10 wkl