我有一个 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")
}

完成时,完成函数 _my_cdp 会将正在完成的单词作为参数 $2;我们将它提供给 compgen -d (带有前缀 $proj ),并循环遍历结果(结果每行输出一个——所以是的,如果你的目录中有换行符,它会中断)。找到每个名称后,我们使用 printf '%q' 引用它,同时使用参数扩展删除前缀 $proj 。如果目录名称包含空格或有趣的字符(例如,glob 字符),则使用引号是为了不中断,并且我们一次填充数组 COMPREPLY 一个术语。这是处理完成的一种相当健壮的方式(但不是 100% 牢不可破,但它可以为您的非疯狂目录名称完成这项工作!)。

关于bash - 运行 cd 时,Shell 脚本认为目录不存在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41400557/

10-12 21:05
查看更多