重新加载完成动态bash

时间:2014-12-22 08:22:29

标签: bash

我编写了一个自定义完整行,我使用.profile中的以下行在Solaris上加载:

source .deploymentrc

所述文件的内容:

TODAY=`date +%Y%m%d`
scriptDir="/bea/user_projects/deployment/scripts/$TODAY"

complete -W "$(echo `ls $scriptDir | uniq `;)" ./deploy

但是,文件夹/ bea / user_projects / deployment / scripts / $ TODAY会使用其他脚本自动填充,当添加内容时,我的制表符完成结果已过期。 当我点击“TAB”时,有没有办法让这个更新或重新运行完整的命令?

2 个答案:

答案 0 :(得分:2)

不要使用一组固定的单词,但使用生成完成的函数:

today=$(date +%Y%m%d)
scriptDir="/bea/user_projects/deployment/scripts/$today"

complete_deploy() {
    local oldnullglob=$(shopt -p nullglob)
    shopt -s nullglob
    COMPREPLY=( "$scriptDir"/* )
    eval "$oldnullglob"
}
complete -F complete_deploy ./deploy

complete_deploy中的魔力只是行COMPREPLY=( "$scriptDir"/* )。其他行只处理shell选项nullglob:保存状态,设置它(因为我们正在使用glob)并恢复其状态。

您还可以在此功能中自动生成日期:

complete_deploy() {
    local today=$(date +%Y%m%d)
    local scriptDir="/bea/user_projects/deployment/scripts/$today"
    local oldnullglob=$(shopt -p nullglob)
    shopt -s nullglob
    COMPREPLY=( "$scriptDir"/* )
    eval "$oldnullglob"
}
complete -F complete_deploy ./deploy

或者,如果你有Bash≥4.2,每次点击Tab键时你都会保存一个外部进程:

complete_deploy() {
    local scriptDir;
    printf -v scriptDir "/bea/user_projects/deployment/scripts/%(%Y%m%d)" -1
    local oldnullglob=$(shopt -p nullglob)
    shopt -s nullglob
    COMPREPLY=( "$scriptDir"/* )
    eval "$oldnullglob"
}
complete -F complete_deploy ./deploy

答案 1 :(得分:1)

由于您采购scriptDir和执行命令之间的时间间隔,.deploymentrc中的文件不匹配可能会出现问题。更好的方法是在此脚本的~/.bashrc中创建一个函数:

function deployment {
    TODAY=`date +%Y%m%d`
    scriptDir="/bea/user_projects/deployment/scripts/$TODAY"

    complete -W "$(echo `ls $scriptDir | uniq `;)" ./deploy
}

然后给它一个简短的别名:

alias depupdate='deployment'

您可以简单地发出depupdate命令,以便在发出别名时重新创建您的uniq列表,而不是采购然后使用制表符完成。否则,您将始终可以在采购和执行之间添加其他文件。

这是帮助解决问题的一种方法。