Variáveis de preenchimento automático do Bash para outros comandos além do cd

3

Eu tenho a variável de env $SCRIPT . Normalmente eu posso usar autocomplete

vim $SC<tab>

e conclusão funciona conforme o esperado. Em alguns sistemas, isso não funciona. Eu tenho o bash completion carregado, mas a conclusão nesses casos funciona apenas com diretórios ( cd $SCRIPT_DIREC<tab> está funcionando).

Principalmente tenho problema com o bash 4.2.

Qual shopt pode ativá-lo?

EDIT: Eu comparei minhas configurações shopt com Bash 4.3 onde está funcionando e Bash 4.2 (servidor Ubuntu 12.04), onde não está funcionando, houve poucas diferenças (a maioria deles 4.3 específicos), definir o resto o mesmo, mas nada funcionou.

    
por pevik 24.04.2014 / 13:34

2 respostas

0

Uma maneira é, você pode simplesmente colocar seu alias como

alias Script="<Your $Script Here>"

no perfil de seus usuários em /home/user/.profile e, em seguida, digite-o com:

$ . profile

Em seguida, verifique se ele é preenchido automaticamente.

    
por 10.07.2014 / 06:51
0

o problema é especificamente que os built-in do shell funcionam para expandir os nomes dos parâmetros, mas os comandos externos não. é por isso que "cd" funciona. "echo", "read" e qualquer outro builtin continuam a funcionar como o OP espera.

nada a ver com shopts.

está na biblioteca bash_completion (/ etc / bash_completion no meu sistema 12.04.4). Existe algo na versão 1.3 que causa esta situação de falha. em algum lugar em ou antes de 1.99 foi corrigido.

o bash_completion lib irá automaticamente originar ~ / .bash_completion se existir, então eu sugiro criar um arquivo com o seguinte conteúdo para sobrecarregar a função defs no arquivo 12.04.4 lib que não funciona para você. Eu fiz alguns testes menores, mas eu não sou afetado por esta situação em qualquer uma das máquinas que eu uso, portanto, emptor advertência.

# following functions are direct copy/pastes from
# bash_completion RELEASE: 1.99
# overloading '_longopt()' and adding '_variables()' and '_init_completion()'
# appears to be all that is needed to correct this.
# 
# http://unix.stackexchange.com/questions/126300/bash-autocomplete-variables-for-other-commands-than-cd

_init_completion()
{
    local exclude= flag outx errx inx OPTIND=1
    while getopts "n:e:o:i:s" flag "$@"; do
        case $flag in
            n) exclude+=$OPTARG ;;
            e) errx=$OPTARG ;;
            o) outx=$OPTARG ;;
            i) inx=$OPTARG ;;
            s) split=false ; exclude+== ;;
        esac
    done
    # For some reason completion functions are not invoked at all by
    # bash (at least as of 4.1.7) after the command line contains an
    # ampersand so we don't get a chance to deal with redirections
    # containing them, but if we did, hopefully the below would also
    # do the right thing with them...
    COMPREPLY=()
    local redir="@(?([0-9])<|?([0-9&])>?(>)|>&)"
    _get_comp_words_by_ref -n "$exclude<>&" cur prev words cword
    # Complete variable names.
    _variables && return 1
    # Complete on files if current is a redirect possibly followed by a
    # filename, e.g. ">foo", or previous is a "bare" redirect, e.g. ">".
    if [[ $cur == $redir* || $prev == $redir ]]; then
        local xspec
        case $cur in
            2'>'*) xspec=$errx ;;
            *'>'*) xspec=$outx ;;
            *'<'*) xspec=$inx ;;
            *)
                case $prev in
                    2'>'*) xspec=$errx ;;
                    *'>'*) xspec=$outx ;;
                    *'<'*) xspec=$inx ;;
                esac
                ;;
        esac
        cur="${cur##$redir}"
        _filedir $xspec
        return 1  
    fi
    # Remove all redirections so completions don't have to deal with them.
    local i skip  
    for (( i=1; i < ${#words[@]}; )); do
        if [[ ${words[i]} == $redir* ]]; then
            # If "bare" redirect, remove also the next word (skip=2).
            [[ ${words[i]} == $redir ]] && skip=2 || skip=1
            words=( "${words[@]:0:i}" "${words[@]:i+skip}" )
            [[ $i -le $cword ]] && cword=$(( cword - skip ))
        else
            i=$(( ++i ))
        fi
    done
    [[ $cword -eq 0 ]] && return 1
    prev=${words[cword-1]}
    [[ ${split-} ]] && _split_longopt && split=true
    return 0
}

_variables()
{
    if [[ $cur =~ ^(\$\{?)([A-Za-z0-9_]*)$ ]]; then
        [[ $cur == *{* ]] && local suffix=} || local suffix=
        COMPREPLY+=( $( compgen -P ${BASH_REMATCH[1]} -S "$suffix" -v -- \
            "${BASH_REMATCH[2]}" ) )
        return 0  
    fi
    return 1
}

_longopt()
{   
    local cur prev words cword split
    _init_completion -s || return
    case "${prev,,}" in
        --help|--usage|--version)
            return 0
            ;;
        --*dir*)
            _filedir -d
            return 0
            ;;
        --*file*|--*path*)
            _filedir
            return 0
            ;;
        --+([-a-z0-9_]))
            local argtype=$( $1 --help 2>&1 | sed -ne \
                "s|.*$prev\[\{0,1\}=[<[]\{0,1\}\([-A-Za-z0-9_]\{1,\}\).*||p" )
            case ${argtype,,} in
                *dir*)
                    _filedir -d
                    return 0
                    ;;
                *file*|*path*)
                    _filedir
                    return 0
                    ;;
            esac
            ;;
    esac
    $split && return 0
    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W "$( $1 --help 2>&1 | \
            sed -ne 's/.*\(--[-A-Za-z0-9]\{1,\}=\{0,1\}\).*//p' | sort -u )" \
            -- "$cur" ) )
        [[ $COMPREPLY == *= ]] && compopt -o nospace
    elif [[ "$1" == @(mk|rm)dir ]]; then
        _filedir -d
    else
        _filedir
    fi
}
    
por 11.07.2014 / 00:50