내 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
하고 true이면 이 디렉터리의 내용을/git/function/get
자동 완성으로 생성해야 합니다) - 입력하면 delete.TAB(존재하는지 확인해야 하고
sub-dir
, true이면 이 디렉토리의 내용을/git/function/delete
자동 완성으로 생성해야 함)
사용자 정의 함수를 동적으로 로드하는 더 나은 솔루션을 알고 계시다면 몇 가지 팁을 공유해 주시면 감사하겠습니다.
답변1
프로그래밍 가능한 완성 문자는 쉽게 변경할 수 있습니다.
bind '".":complete'
그러나 나는 이것이 갈 길이 아니라고 생각합니다.
더 좋은 방법은 계층 구조(또는 get
및 와 같은 특정 디렉터리)에서 모든 실행 파일을 가져오고 이 파일 목록을 및 delete
의 결과 집합 으로 사용하는 것입니다.complete -E # ...
complete -I # ...