Bash Shell脚本认为运行cd时目录不存在

Bash Shell脚本认为运行cd时目录不存在,bash,cd,Bash,Cd,我有一个shell脚本(源代码是.bashrc),它允许我从任何地方跳转到我的项目目录 cdp(){ proj="~/dev/projects/$@/" builtin cd $proj } _my_cdp() { local cur opts cur="${COMP_WORDS[COMP_CWORD]}" opts=$(ls ~/dev/projects/) COMPREPLY=( $(compgen -W "${opts}" -- ${cur

我有一个shell脚本(源代码是.bashrc),它允许我从任何地方跳转到我的项目目录

cdp(){
  proj="~/dev/projects/$@/"
  builtin cd $proj
}

_my_cdp()
{
  local cur opts
      cur="${COMP_WORDS[COMP_CWORD]}"
      opts=$(ls ~/dev/projects/)
      COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
}

complete -o nospace -F _my_cdp cdp
问题是,第3行的
cd
显示:

bash: cd: ~/dev/projects/jsonparse/: No such file or directory
下面是显示错误并证明目录存在的完整控制台输出

amflare:~$ cd dev/projects/ (go to dir)
amflare:~/dev/projects$ ls -al (look at contents)
total 68
drwxrwxr-x 17 www-data amflare 4096 Dec 29 13:11 .
drwxrwxr-x  4 amflare amflare 4096 Dec  6 17:32 ..
drwxrwxr-x  3 www-data amflare 4096 Dec 22 17:33 bot
drwxrwxr-x  3 www-data amflare 4096 Dec 20 15:17 jsonparse
drwxrwxr-x  3 www-data amflare 4096 Dec 28 19:58 magic
drwxrwxr-x  2 www-data amflare 4096 Nov 11 14:42 test
amflare:~/dev/projects$ cd (go to home)
amflare:~$ cdp (run autocomplete)
bot         jsonparse   magic       test
amflare:~$ cdp jsonparse (pick target)
bash: cd: ~/dev/projects/jsonparse/: No such file or directory
amflare:~$ (still in home)

我已经尝试了我能想到的一切,还有一些谷歌为其他发行版提供的东西(我在Ubuntu Gnome 16.04上)。无论我做什么,shell脚本都不会确认
~/dev/projects/
中存在任何内容。此外,当我在
.bashrc
本身中有函数时,它不起作用,因此我认为这不是一个子shell问题。如果你需要更多的信息,请告诉我。谢谢。

那是因为瓷砖没有展开。使用
proj=~/“dev/projects/$@/”
并在引号外加上波浪号。或者使用变量
HOME
proj=“$HOME/dev/projects/$@”
。但是请注意,使用
$@
并不是很好。如果有几个论点,你想要什么


另外,不要使用
opts=$(ls~/dev/projects/)
。直接使用compgen,如下所示:

cdp() {
  local proj=~/dev/projects/
  builtin cd "$proj$1"
}

_my_cdp() {
    local proj=~/dev/projects/
    local i p
    COMPREPLY=()
    while IFS= read -r i; do
        printf -v p '%q' "${i#"$proj"}"
        COMPREPLY+=( "$p" )
    done < <(compgen -d -- "$proj$2")
}
cdp(){
本地项目=~/dev/projects/
内置cd“$proj$1”
}
_my_cdp(){
本地项目=~/dev/projects/
本地IP
压缩=()
当IFS=read-ri;do时
printf-vp'%q'${i#“$proj”}
压缩+=(“$p”)

完成<这是因为波浪号未展开。使用
proj=~/“dev/projects/$@/”
,波浪号不在引号中。或者使用变量
HOME
proj=“$HOME/dev/projects/$@”。注意,使用<代码> $@ /代码>并不是很好。如果有几个参数,你想要什么?考虑运行这个代码——有很多错误;它可能无法捕获所有的东西,但是它是一个开始的地方……参见,f/e,-<代码> ls <代码>是一个不合适的程序使用工具。oughout导致了它自己的问题。@Charlesduff-我已经在那里运行了它,但是我想我做了一些错误的事情,因为再次这样做显示了问题。谢谢提醒。这就是问题所在。谢谢。至于$@,我是根据其他人的代码编写的,没有费心去修改它。不过我现在已经修改了。@TBill:answer稍微编辑了一下以获得更好的答案完成!啊!干杯!我实际上是在试图弄明白。这里有很多移动的部分,我不明白。会有太多的麻烦跑下来,代码高尔夫球风格?@ TBiRell:增加了一段;不确定是否一切都有意义!如果你有任何具体的问题,请自由提出一些澄清。