Как переменные могут использовать «~» для cd'ing?

13

Как я могу использовать переменную - $BASEв моем CD. Я попробовал следующее, но я получаю ошибку

$ cd ~/z/repo_1_ruby_193/
23:23:57 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 

$ BASE="~/z"
23:24:03 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 

$ cd $BASE/repo_1_ruby_193
-bash: cd: ~/z/repo_1_ruby_193: No such file or directory
23:24:25 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 
Майкл Даррант
источник

Ответы:

25

В cd ~/z/использовании расширения тильды для расширения ~в вашей домашней директории. В BASE="~/z", вы не потому, что вы цитировали ~символ, поэтому он не раскрывается. Вот почему вы получаете сообщение с жалобой на несуществующий ~каталог. Решение состоит в том, чтобы не заключать это в кавычки, то есть BASE=~/z, чтобы позволить расширению произойти.

jw013
источник
11

@ jw013 дал правильное объяснение и решение.

Но могут быть случаи, когда вы хотите процитировать пути, например, когда они содержат несколько пробелов или специальных символов. В этом случае вы должны использовать $HOMEвместо ~, т.е. ваш BASE="~/z"станет BASE="$HOME/z"и будет работать правильно, потому что подстановка параметров интерпретируется в двойных кавычках, в отличие от расширения тильды.

Руслан
источник
5
Это один из способов сделать это, но это не обязательно. BASE=~/"quoted name"работает просто отлично, если ~оставить его без кавычек.
HVd
4
@hvd: вы также должны оставить косую черту без кавычек. BASE=~/"quoted name"работает, но BASE=~"/quoted name"не работает
Гордон Дэвиссон
Ты прав. Хороший улов.
августа