我的 bash 函数目录位于/git/function
这是结构:
/git/function/
├── delete
│ ├── delete.dir
│ └── delete.file
├── main.sh
├── get
│├── get.dir.sh
│└── get.file.sh
如何使用 main.sh
用法:get + space + TAB(从/git/function/get/
目录自动完成)
输出:
dir file
下一个:当我选择选择时,get file
它会运行脚本/git/function/get/get.file.sh
#!/bin/bash
# Directory where the functions are located
functiondir="/git/function"
# List of supported commands:
commands=(
"get"
"delete"
)
# Function to execute the 'get' command
get() {
echo "Running $functiondir/get/get.$1.sh"
}
# Function to execute the 'delete' command
delete() {
echo "Running $functiondir/delete/delete.$1.sh"
}
# Autocompletion function for command names
_completion() {
# Find all files in the specified function directory with the given command name
local function_files=$(find "$functiondir/$1" -maxdepth 1 -type f -name "$1.*.sh" -printf '%f\n' | sed "s/^$1\.//;s/\.sh$//")
# Generate autocompletion options based on the found files
COMPREPLY=($(compgen -W "$function_files" -- "${COMP_WORDS[COMP_CWORD]}"))
}
# Set autocompletion for 'get' and 'delete' commands using the _completion function
complete -F _completion -o filenames "${commands[@]}"
我有几个问题:
- main.sh 源自 .bashrc
- 我想使用.而不是space命令完成,
- 我需要从子目录动态生成内容
/git/function/
,而不向 main.sh 添加其他功能 - 例如命令的第一部分:如果我输入get.TAB (我应该检查是否
sub-dir
存在,如果为真则生成此目录的内容/git/function/get
作为自动完成) - 如果我输入delete.TAB(我应该检查是否
sub-dir
存在,如果为真则生成此目录的内容/git/function/delete
作为自动完成)
如果您知道动态加载自定义函数的更好解决方案,如果您能分享一些技巧,我将不胜感激
答案1
可编程完成字符可以轻松更改:
bind '".":complete'
不过,我不认为这是该走的路。
我想更好的方法是从层次结构中获取所有可执行文件(或只是某些目录,如get
和),并使用此文件列表作为和delete
的结果集complete -E # ...
complete -I # ...