当使用变量设置路径时,出现“没有这样的文件或目录”,但其他情况下工作正常

当使用变量设置路径时,出现“没有这样的文件或目录”,但其他情况下工作正常

我设置了变量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 将尝试查找~不存在的名为的目录。

相关内容