bash: 명령 완성을 위해 공백 대신 .

bash: 명령 완성을 위해 공백 대신 .

내 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 # ...

관련 정보