La expansión de Tilde no funciona en Bash

Digamos que tengo una carpeta llamada Foo ubicada en /home/user/ (mi /home/user también está representado por ~ ).

Quiero tener una variable

a="~/Foo" y luego hacer

cd $a

Obtengo -bash: cd: ~/Foo: No such file or directory

Sin embargo, si acabo de hacer cd ~/Foo , funciona bien. ¿Alguna pista sobre cómo hacer que esto funcione?

Puede hacerlo (sin comillas durante la asignación de variable):

 a=~/Foo cd "$a" 

Pero en este caso, la variable $a no almacenará ~/Foo pero la forma expandida /home/user/Foo . O puede usar eval :

 a="~/Foo" eval cd "$a" 

Puede usar $HOME lugar de la tilde (la tilde se expande por el shell a los contenidos de $HOME ). Ejemplo:

 dir="$HOME/Foo"; cd "$dir"; 

Si usa comillas dobles, ~ se mantendrá como ese carácter en $ a.

cd $ a no ampliará el ~ ya que el shell no expande los valores de las variables.

La solucion es:

eval “cd $ a”

Una solución mucho más robusta sería usar algo como sed o incluso mejor, la expansión del parámetro bash:

 somedir="~/Foo/test~/ing"; cd ${somedir/#\~/$HOME} 

o si debes usar sed,

 cd $(echo $somedir | sed "s#^~#$HOME#")