При использовании переменной для задания пути я получаю & ldquo; Нет такого файла или каталога & rdquo ;, но в остальном работает нормально

Я установил переменную CATKIN_WS="~/catkin_ws", но когда я ее использую, она не работает. Однако, если я просто иду по пути, по которому я его установил, у меня нет проблем. Почему он не работает, когда я устанавливаю его как переменную, а работает иначе?

(venv) cedric@ubuntu-cedric:~$ echo $CATKIN_WS
~/catkin_ws
(venv) cedric@ubuntu-cedric:~$ cd $CATKIN_WS
bash: cd: ~/catkin_ws: No such file or directory
(venv) cedric@ubuntu-cedric:~$ cd ~/catkin_ws/
(venv) cedric@ubuntu-cedric:~/catkin_ws$
3
задан 26 August 2019 в 18:58

2 ответа

В оболочке, даже при том, что двойные кавычки обеспечивают более слабая форма из [1 115] заключение в кавычки , чем [1 116] одинарные кавычки , они все еще подавляют расширение тильды , который является тем, что преобразовывает ~/catkin_ws (в некоторых контекстах, где это появляется) в фактический путь.

, поскольку catkin_ws не содержит символов, которые рассматривает особенно оболочка, я предлагаю, чтобы Вы просто опустили двойные кавычки в том присвоении, пишущий это вместо этого:

CATKIN_WS=~/catkin_ws

(Который работает, потому что после = в переменном присвоении, т.е. в начале значения Вы присваиваете переменной, одно из мест, где расширение тильды выполняется. Другие после : в значении Вы присваиваете переменной и, конечно, в самом начале слова.)

, Но если Вы хотели к кавычке catkin_ws, Вы могли:

CATKIN_WS=~/'catkin_ws'

можно также использовать $HOME вместо ~ как [1 118], ajgringo619 предложил , с тех пор даже при том, что расширение тильды не выполняется вместо этого двойные кавычки, , расширение параметра . Пока HOME установлен, это достигнет того же самого. (Если HOME сброшен, который является странным и маловероятным что-то, что Вы хотите попытаться обработать, затем различные оболочки ведут себя по-другому; bash взгляды в базе данных пользователей для выяснения корректного корневого каталога в этой ситуации.) Это - общая и разумная альтернатива.

Примечание, что, в то время как начальное использование двойных кавычек предотвратило расширение тильды, Вы хотели, они не предотвратят расширение параметра [1 112] позже. Вы должны двойная кавычка те расширения. , Если Вы не заключаете им в кавычки , расширенное значение подвергается слово, разделяющее и globbing, который Вы не хотите здесь (и чаще всего не хотят, когда Вы используете расширение параметра).

Дополнительные материалы для чтения: , Почему не делает тильды (~) разворачивают внутренние двойные кавычки?

4
ответ дан 17 November 2019 в 09:37

От man bash:

EXPANSION
       Expansion  is performed on the command line after it has been split into words.  There are
       seven kinds of expansion performed: brace expansion, tilde expansion, parameter and  vari‐
       able  expansion,  command substitution, arithmetic expansion, word splitting, and pathname
       expansion.

       The order of expansions is: brace  expansion;  tilde  expansion,  parameter  and  variable
       expansion,  arithmetic  expansion, and command substitution (done in a left-to-right fash‐
       ion); word splitting; and pathname expansion.

, Как Вы видите, расширение тильды выполняется перед переменным расширением, поэтому если Вы работаете cd $CATKIN_WS, оболочка попытается найти каталог названным ~, который не существует.

2
ответ дан 17 November 2019 в 09:37

Другие вопросы по тегам:

Похожие вопросы: