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

bash – 如何完成相对于另一个目录的文件名?

发布时间:2020-12-15 21:48:41 所属栏目:安全 来源:网络整理
导读:这是以下讨论的后续问题: https://bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/1394920 假设我有一个带有一些文件和目录的文件夹?/ tmp: $mkdir a; touch file1.txt; mkdir a/b; mkdir a/c; touch a/d; mkdir a/b/c 我现在尝试在?/ tmp中创建
这是以下讨论的后续问题:

https://bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/1394920

假设我有一个带有一些文件和目录的文件夹?/ tmp:

$mkdir a; touch file1.txt; mkdir a/b; mkdir a/c; touch a/d; mkdir a/b/c

我现在尝试在?/ tmp中创建一个完成脚本来完成文件名,但是如果当前目录是?/ tmp,则完整的-o filenames选项才能正常工作.

有关更多背景信息,请参阅上面的链接.这是我得到的:

$cat setup
_compTest() {
    local cur baseFolder
    cur="${COMP_WORDS[$COMP_CWORD]}"
    baseFolder=~/tmp
    compopt -o nospace
    COMPREPLY=(  $(
       cd "$baseFolder"
       if [[ ${cur: -1} != "/" && -d $cur ]] ; then
           echo "$cur/"
       else
           compgen -f "$cur"
       fi
      )  )
}
complete -F _compTest aaa

然后我来源:

$. setup

然后我就可以了

$aaa <tab><tab>

>问题1:在完成列表中的目录名称末尾没有添加斜杠(这样可以轻松地将目录与完成列表中的文件名分开)
>问题2:对于aa&a;&tab;>< tab>完成列表是a / b a / c a / d但是a /前缀不应该在那里.它应该是b / c / d而不是.

解决方法

我会把这个函数写成:

_compTest () 
{ 
    local cur; local tmp;  local tmp_escaped; local i;
    _get_comp_words_by_ref cur;
    local _compreply=()
    tmp=~/tmp/
    tmp_escaped=${tmp/////}
    cur=$tmp$cur;

    if [ "$1" == "-d" ]; then
        _cd
    else
        _filedir;
    fi;
    for i in "${COMPREPLY[@]}"; do
        [ -d "$i" ] && [ "$i" != "$tmp." ] && [ "$i" != "$tmp.." ] && i="$i/"
        _compreply=("${_compreply[@]}" "$i")
    done

    COMPREPLY=(${_compreply[@]/$tmp_escaped/})
} && complete -o nospace -F _compTest aaa_files

_compTestDir()
{
    _compTest -d
} && complete -o nospace -F _compTestDir aaa_directories

它有3个部分,

>将$cur添加到基本目录前面 – ?/ tmp.
>使用标准bash完成例程_filedir用于cd / ls等.
>从COMPREPLY中删除?/ tmp

仅供记录:您可以使用此逻辑来完成相对于许多其他类型路径的文件名,例如

>我用它来完成perforce路径// ….>您还可以完成相对于public_html目录的http:// localhost / *路径.

(编辑:李大同)

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

    推荐文章
      热点阅读