Bash 스크립트 - 배열 데이터를 기반으로 자동 완성 사용자 입력

Bash 스크립트 - 배열 데이터를 기반으로 자동 완성 사용자 입력

Bash 스크립트에서 일부 사용자 입력을 읽고 있습니다 read. 이제 키 입력을 통해 입력을 자동 완성할 수 있는 기능을 제공하고 싶습니다 Tab.

간단한 예: 사용자가 유한 필드에서 이름을 입력해야 한다고 가정해 보겠습니다. 스크립트에는 자동 완성 제안에 포함되어야 하는 모든 유효한 이름이 포함된 배열이 있습니다.

프로그래밍 가능한 완성 기능으로 몇 가지를 시도했지만 스크립트를 이식할 수 있기를 원합니다. 즉, 모든 것이 가능해야 합니다.존재하다이 스크립트. 유사한 것은 mysql입니다. 입력 SELECT * FROM하고 클릭 Tab하면 데이터베이스에서 사용 가능한 모든 테이블(실제로는 모든 열)이 표시됩니다.

Mac OS X에서 작동해야 합니다.

답변1

사용되감기, readline 래퍼.

~에서man rlwrap

rlwrap은 지정된 명령을 실행하여 사용자 입력을 가로채서 readline의 줄 편집, 지속적인 기록 및 완료 기능을 제공합니다.

그리고 데비안 rlwrap패키지 설명은 다음과 같습니다:

이 패키지는 GNU readline 라이브러리를 사용하여 다른 명령에 대한 키보드 입력을 편집할 수 있는 작은 유틸리티를 제공합니다. 입력 기록은 각 명령에 대해 개별적으로 호출 전반에 걸쳐 기억됩니다. bash에서와 같이 기록 완료 및 검색 작업이 완료 단어 목록을 명령줄에 지정할 수 있습니다.

매우 간단한 예제 스크립트:

#! /bin/bash

ynm=(Yes No Maybe)

reply=$(rlwrap -S 'Do you want to continue? ' -H ~/.jakob.history
        -e '' -i -f <(echo "${ynm[@]}") -o cat)

echo "reply='$reply'"

이는 표준 입력을 얻기 위해 rlwrap일회성 모드로 실행되지만 한 줄의 입력만 허용합니다. 예, 대안을 권장합니다 .cat-o catrlwrapread

명령줄 기록은 bash 배열에 저장 ~/.jakob.history되고 완성은 bash 배열에 저장됩니다 $ynm.

rlwrap옵션에 대한 인수로 파일이 필요합니다 -f. 다행히 프로세스 대체를 사용하여 <(echo "${ynm[@]}")파일 대신 배열을 제공할 수 있습니다.

-i완료 시 대소문자를 구분하지 않도록 설정합니다.

성공적으로 완료되면 공백 -e ''추가를 중지합니다 rlwrap( 예를 들어 후행 공백 이 아닌 $reply포함되도록 ).'Maybe''Maybe '

입력 줄 앞에 기본값을 추가하려면 위의 예제 스크립트 에 추가된 명령과 같은 -P또는 옵션을 사용할 수 있습니다. 사용자는 단순히 승인, 백스페이스 또는 - 를 클릭하여 기본값을 삭제할 수 있습니다 . (이것은 emacs 모드에서는 정상입니다 .)--pre-given-P YesrlwrapEnterCtrlUreadline

man rlwrap자세한 내용과 추가 옵션을 확인하세요 . 예를 들어 -c파일 이름 완성 을 사용하거나 활성화 할 수 있습니다 --complete-filenames.

소스 코드를 다운로드하고 컴파일하기 전에 rlwrap배포용으로 패키지되어 있는지 확인하세요(적어도 Debian의 경우, 적어도 Ubuntu/Mint/etc의 경우).

관련 정보