我有一个Shell脚本(我将其source到.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
问题在于,第三行的
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/$@"
。但请注意,使用$@
并不是很好。如果有多个参数,你想要什么? - gniourf_gniourfls
不适合于编程使用。而且,缺乏引用会导致其自身的问题。 - Charles Duffy