Тильда в пути не распространяется на домашний каталог - PullRequest
18 голосов
/ 21 апреля 2011

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

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

a="~/Foo", а затем сделать

cd $a

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

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

Ответы [ 4 ]

26 голосов
/ 21 апреля 2011

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

a=~/Foo
cd "$a"

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

a="~/Foo"
eval cd "$a"
12 голосов
/ 21 апреля 2011

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

dir="$HOME/Foo";
cd "$dir";
0 голосов
/ 08 мая 2012

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

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

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

cd $(echo $somedir | sed "s#^~#$HOME#")
0 голосов
/ 21 апреля 2011

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

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

Решение:

eval "cd $ a"

...