加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 21:25:10 所属栏目:安全 来源:网络整理
导读:我有一个 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 "${
我有一个 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)

我已经尝试了所有我能想到的东西以及google为其他发行版回馈的一些东西(我在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%牢不可破,但它会为你的非疯狂目录名做好工作!).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读