我编写了一个自定义完整行,我使用.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”时,有没有办法让这个更新或重新运行完整的命令?
答案 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列表,而不是采购然后使用制表符完成。否则,您将始终可以在采购和执行之间添加其他文件。
这是帮助解决问题的一种方法。