Bash 완료 및 변경 번호?

Bash 완료 및 변경 번호?

bash에서 명령을 "dfk-1234" 또는 "DFK-nnnnn"(숫자는 0으로 채워지지 않고 1~5자리일 수 있음)으로 사용하는 함수, 별칭 또는 명령 완성을 만든 다음 "dfkp" 명령을 실행하고 싶습니다. DFK -nnnn".

인수는 단어 그대로 전달되어야 합니다. "dfk-18875 cat file.txt"는 "dfpk DFK-18875 cat file.txt"가 되어야 합니다.

명령 완성이나 탭 확장이 작동할 수 있을 것 같은데 숫자가 변경되면 어떻게 해야 할지 모르겠습니다.

가장 좋은 접근 방식은 무엇입니까? 기본 명령 이름을 처리할 수 있게 되면 나머지(대소문자, 매개변수 등)도 처리할 수 있습니다.

답변1

헤비히트 4.0새로운 기능 도입command_not_found_handle찾을 수 없는 명령을 처리하기 위해 - 존재하는 경우 이름이 지정된 함수를 호출합니다 . 이 동작을 사용하여 dfk-NNN 또는 DFK-NNN이라는 "프로그램"에 대한 호출을 가로채고 필요에 따라 다시 실행할 수 있습니다. 우리는 이미 4.0 동작에 의존하고 있으므로 대문자 및 소문자 매개변수 확장 기능도 사용합니다.

command_not_found_handle() {
  case "${1,,}" in
        (dfk-?|dfk-??|dfk-???|dfk-????|dfk-?????)
                echo dfkp "${1^^}" "${@:2}"
                return 0
        ;;
        (*)
                printf 'bash: %s: command not found\n' "$1" >&2
                return 127
        ;;

  esac
}

존재하지 않는 명령이 입력되면 bash는 원래 명령줄을 사용하여 이 함수를 호출합니다. 이 명령문은 원하는 패턴과 case더 쉽게 비교할 수 있도록 첫 번째 인수를 소문자로 만듭니다 .dfk

명령이 dfk-1, 2, 3, 4 또는 5개의 문자로 시작하고 끝나는 경우(적절하다고 생각되는 숫자까지 조임) 현재 디버깅 목적으로 에코되지만 그런 다음 dfkp첫 번째 인수는 대문자 버전입니다. 초기 dfk 항목과 나머지 명령줄이 이어집니다.

일치하지 않는 명령의 경우 dfk-NNNN실패하고 시뮬레이션된 bash 오류 메시지를 stderr에 인쇄하고 127을 반환합니다. (이는 마치 command_not_found_handle이 존재하지 않는 것과 같은 기본 동작과 일치합니다.)

샘플 세션(실제 dfkp 프로그램이 없기 때문에 에코 디버깅이 설치됨):

$ dfk-1234
dfkp DFK-1234
$ dfk-18875 cat file.txt
dfkp DFK-18875 cat file.txt
$ some-other-command
bash: some-other-command: command not found
$ dfk-1
dfkp DFK-1
$ dfk-12345
dfkp DFK-12345

관련 정보