![当使用变量设置路径时,出现“没有这样的文件或目录”,但其他情况下工作正常](https://linux22.com/image/1014581/%E5%BD%93%E4%BD%BF%E7%94%A8%E5%8F%98%E9%87%8F%E8%AE%BE%E7%BD%AE%E8%B7%AF%E5%BE%84%E6%97%B6%EF%BC%8C%E5%87%BA%E7%8E%B0%E2%80%9C%E6%B2%A1%E6%9C%89%E8%BF%99%E6%A0%B7%E7%9A%84%E6%96%87%E4%BB%B6%E6%88%96%E7%9B%AE%E5%BD%95%E2%80%9D%EF%BC%8C%E4%BD%86%E5%85%B6%E4%BB%96%E6%83%85%E5%86%B5%E4%B8%8B%E5%B7%A5%E4%BD%9C%E6%AD%A3%E5%B8%B8.png)
我设置了变量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$
答案1
在 shell 中,尽管双引号提供较弱的形式的引用比单引号,他们仍然压制波浪号扩展,它将~/catkin_ws
(在某些出现的上下文中)转换为实际路径。
因为catkin_ws
不包含任何被 shell 特殊处理的字符,所以我建议您简单地省略该作业中的双引号,而是改为这样写:
CATKIN_WS=~/catkin_ws
(这样做是因为=
在变量赋值中的 之后,即在分配给变量的值的开头,是执行波浪号扩展的位置之一。其他的位置是在:
分配给变量的值中的 之后,当然,也是在单词的最开头。)
但如果你想引用,catkin_ws
你可以:
CATKIN_WS=~/'catkin_ws'
$HOME
您还可以~
使用ajgringo619 建议,因为即使不执行波浪符号扩展,而是使用双引号,参数扩展是。只要HOME
设置了,它就会实现相同的效果。(如果未设置HOME
,这很奇怪,并且不太可能是您想要尝试处理的事情,那么不同的 shell 会有不同的行为;bash
在这种情况下,会查看用户数据库以找出正确的主目录。)这是一种常见且合理的替代方案。
请注意,虽然最初使用双引号会阻止您想要的波浪号扩展,但它们不会阻止$CATKIN_WS
稍后的参数扩展。您应该双引号那些扩展。 如果你不引用他们,扩大后的价值取决于单词拆分和通配符,您在这里不需要它(并且当您使用参数扩展时,通常也不想要它)。
进一步阅读:为什么波浪符号(~)在双引号内不会扩展?
答案2
从man bash
:
扩张 命令行拆分成单词后,会进行扩展。 执行七种扩展:大括号扩展、波浪号扩展、参数和变量 能够扩展、命令替换、算术扩展、单词拆分和路径名 扩张。 扩展的顺序为:括号扩展;波浪号扩展、参数和变量 扩展、算术扩展和命令替换(以从左到右的方式完成) ion)、单词拆分以及路径名扩展。
正如您所见,波浪号扩展在变量扩展之前执行,因此如果您运行cd $CATKIN_WS
,shell 将尝试查找~
不存在的名为的目录。