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 cat
rlwrap
read
명령줄 기록은 bash 배열에 저장 ~/.jakob.history
되고 완성은 bash 배열에 저장됩니다 $ynm
.
rlwrap
옵션에 대한 인수로 파일이 필요합니다 -f
. 다행히 프로세스 대체를 사용하여 <(echo "${ynm[@]}")
파일 대신 배열을 제공할 수 있습니다.
-i
완료 시 대소문자를 구분하지 않도록 설정합니다.
성공적으로 완료되면 공백 -e ''
추가를 중지합니다 rlwrap
( 예를 들어 후행 공백 이 아닌 $reply
포함되도록 ).'Maybe'
'Maybe '
입력 줄 앞에 기본값을 추가하려면 위의 예제 스크립트 에 추가된 명령과 같은 -P
또는 옵션을 사용할 수 있습니다. 사용자는 단순히 승인, 백스페이스 또는 - 를 클릭하여 기본값을 삭제할 수 있습니다 . (이것은 emacs 모드에서는 정상입니다 .)--pre-given
-P Yes
rlwrap
EnterCtrlUreadline
man rlwrap
자세한 내용과 추가 옵션을 확인하세요 . 예를 들어 -c
파일 이름 완성 을 사용하거나 활성화 할 수 있습니다 --complete-filenames
.
소스 코드를 다운로드하고 컴파일하기 전에 rlwrap
배포용으로 패키지되어 있는지 확인하세요(적어도 Debian의 경우, 적어도 Ubuntu/Mint/etc의 경우).