Расширение тильды не работает в Bash

Скажем, у меня есть папка с именем Foo, расположенная в /home/user/ (мой /home/user также представлен ~).

Я хочу иметь переменную

a="~/Foo", а затем выполните

cd $a

Я получаю -bash: cd: ~/Foo: No such file or directory

Однако, если я просто делаю cd ~/Foo, он отлично работает. Есть ли подсказка о том, как заставить это работать?

Ответ 1

Вы можете делать (без кавычек при назначении переменной):

a=~/Foo
cd "$a"

Но в этом случае переменная $a не сохранит ~/Foo, а расширенную форму /home/user/Foo. Или вы можете использовать eval:

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

Ответ 2

Вы можете использовать $HOME вместо тильды (тильда расширяется оболочкой до содержимого $HOME). Пример:

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

Ответ 3

Если вы используете двойные кавычки, символ ~ будет сохранен как этот символ в $a.

cd $a не будет расширять значение ~, так как значения переменных не расширяются оболочкой.

Решение:

eval "cd $a"

Ответ 4

Более надежным решением было бы использовать нечто вроде sed или даже лучше, расширение параметра bash:

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

или если вы должны использовать sed,

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