화살표 키가 있는 인라인 텍스트 메뉴 선택기를 표시하는 명령줄 패키지를 찾고 있습니다.

화살표 키가 있는 인라인 텍스트 메뉴 선택기를 표시하는 명령줄 패키지를 찾고 있습니다.

화살표 키와 Enter를 사용하여 탐색할 수 있는 인라인 메뉴를 셸에 표시하는 도구를 찾고 있습니다. "인라인"은 메뉴가 표준 출력 텍스트의 일반적인 흐름 내에 표시된다는 것을 의미합니다.아니요모든 것 위에 팝업 대화 상자가 있습니다.

겨우 찾았어그 게시물이 문제를 해결하려고 시도했지만 사용자 정의 스크립트나 인라인이 아닌/팝업 솔루션(예: dialog또는 zenity)만 언급되었습니다.

내가 찾고 있는 것은 apt-getDocker 이미지에 사용하거나 간단히 설치 npm install -g하고 옵션 목록을 사용하여 스크립트에서 호출하고 사용자가 선택한 항목을 가져올 수 있는 강력한 패키지입니다.

nodeJS에서 나는 사용하고 있습니다질문자이러한 메뉴를 제공할 뿐만 아니라 다양한 입력도 제공합니다.

이것은 예이다스크린샷그런 인라인 메뉴.

이 도구는 쉘 스크립트로 작성될 필요가 없습니다. apt-get사용/설치가 쉬운 한 모든 언어로 작성된 바이너리/스크립트가 될 수 있습니다 curl. 선택 항목을 전달하는 쉘 스크립트에서 호출할 수 있는 한 nodeJS 도구도 가능합니다.

답변1

나는 전에 그것을 사용했다아이셀렉트이를 위해 수년 전.

매우기본 예:

$ sel="$(iselect -a 'foo' 'bar')"
$ echo $sel
foo

에서 man iselect:

iSelect는 전체 화면 Curses 기반 터미널 세션을 통해 작동하는 ASCII 파일용 대화형 라인 선택 도구입니다. Bourne-Shell, Perl 또는 다른 유형의 스크립팅 백엔드로 제어되는 사용자 인터페이스 프런트 엔드에 대한 래퍼로 사용하거나 대량 파이프라인 필터(일반적으로 grep과 최종 실행 명령 사이)로 사용할 수 있습니다. 즉, iSelect는 모든 종류의 행 기반 대화형 선택을 위해 설계되었습니다.

입력 데이터

입력은 각 인수가 버퍼 라인에 해당하는 명령줄(line1 line2 ...)에서 읽거나 버퍼 라인이 개행을 기반으로 결정되는 stdin(인수가 지정되지 않은 경우)에서 읽을 수 있습니다.

"<b>"..."</b>"또한 HTML의 구문을 사용하여 선택 불가능한 줄의 하위 문자열을 굵게 표시할 수 있습니다(선택 가능한 줄은 항상 굵게 표시되므로).

답변2

매우 기본적인 방법은 bashselect문을 사용하는 것입니다. 다른 것을 설치할 필요가 없습니다. 방금 얻은 예는 다음과 같습니다.

#!/bin/bash

[...]

sourceBranch=
targetBranch=
# Force one option per line
columnsBackup=${COLUMNS}
COLUMNS=40

echo "Select source and target branch:"
select branches in \
    "testing -> release-candidate" \
    "release-candidate -> stable-release" \
    "stable-release -> stable"
do
    if [ -z "${branches}" ]; then
        echo "Invalid selection"
        continue
    fi

    sourceBranch="${branches%% -> *}"
    targetBranch="${branches##* -> }"
    break
done

COLUMNS=${columnsBackup}
echo "Releasing from ${sourceBranch} to ${targetBranch}"

[...]

산출:

Select source and target branch:
1) testing -> release-candidate
2) release-candidate -> stable-release
3) stable-release -> stable
#? 1   
Releasing from testing to release-candidate

case ... esac블록 단위로 일부 처리를 수행 할 수도 있습니다 do ... done.

답변3

bash를 사용하여 문제를 해결하는 방법은 다음과 같습니다.

#!/usr/bin/env bash

# Renders a text based list of options that can be selected by the
# user using up, down and enter keys and returns the chosen option.
#
#   Arguments   : list of options, maximum of 256
#                 "opt1" "opt2" ...
#   Return value: selected index (0 for opt1, 1 for opt2 ...)


figlet -st "$COLUMNS" "Welcome $USER"
printf '\n?%s\n?%s\n?%s\n\n' "What's the name of your website simple-site" "What's the description of your website(optional):" "Please choose lincense":

# Change the value of options to whatever you want to use.
options=("MIT" "Apache-2.0" "GPL-3.0" "Others")

select_option (){
  # little helpers for terminal print control and key input
  ESC=$(printf '%b' "\033")

  cursor_blink_on() {
    printf '%s' "$ESC[?25h"
  }

  cursor_blink_off() {
    printf '%s' "$ESC[?25l"
  }

  cursor_to() {
    printf '%s' "$ESC[$1;${2:-1}H"
  }

  print_option() {
    printf '   %s ' "$1"
  }

  print_selected() {
    printf '  %s' "$ESC[7m $1 $ESC[27m"
  }

  get_cursor_row() {
    IFS=';' read -sdR -p $'\E[6n' ROW COL; printf '%s' ${ROW#*[}
  }

  key_input() {
    read -s -n3 key 2>/dev/null >&2
    if [[ $key = $ESC[A ]]; then
      echo up
    fi
    if [[ $key = $ESC[B ]]; then
      echo down
    fi
    if [[ $key = ""  ]]; then
      echo enter
    fi
  }

   # initially print empty new lines (scroll down if at bottom of screen)
   for opt; do
     printf "\n"
   done

   # determine current screen position for overwriting the options
   local lastrow=$(get_cursor_row)
   local startrow=$(($lastrow - $#))

   # ensure cursor and input echoing back on upon a ctrl+c during read -s
   trap "cursor_blink_on; stty echo; printf '\n'; exit" 2
   cursor_blink_off

   local selected=0
   while true; do
     # print options by overwriting the last lines
     local idx=0
     for opt; do
       cursor_to $((startrow + idx))
       if [[ $idx == $selected ]]; then
         print_selected "$opt"
       else
         print_option "$opt"
       fi
       ((idx++))
     done

     # user key control
     case $(key_input) in
       enter) break;;
       up)    ((selected--));
         if (( $selected < 0 )); then selected=$(($# - 1)); fi;;
         down)  ((selected++));
           if (( selected > $# )); then selected=0; fi;;
         esac
       done

       # cursor position back to normal
       cursor_to $lastrow
       printf "\n"
       cursor_blink_on

       return "$selected"
}


select_option "${options[@]}"
choice=$?

index=$choice
value=${options[$choice]}

case $value in 
  MIT)  ## User selected MIT
   read -rp "Really use? $value [Y/N] " answer
   [[ $answer ]] || { echo "No answer!" >&2; exit 1; }
   if [[ $answer == [Yy] ]]; then
     : ## User selected Y or y, what are you going to do about it?
   elif [[ $answer == [Nn] ]]; then
     : ## User selected N or n what are you going to do about it?
   fi
   printf '%s\n' "You have choosen $answer";;
  Apache-2.0)
   read -rp "Really use? $value [Y/N] " answer
   [[ $answer ]] || { echo "No answer!" >&2; exit 1; }
   if [[ $answer == [Yy] ]]; then
     :
   elif [[ $answer == [Nn] ]]; then
     :
   fi
   ;;
  GPL-3.0)
   read -rp "Really use? $value [Y/N] " answer
   [[ $answer ]] || { echo "No answer!" >&2; exit 1; }
   if [[ $answer == [Yy] ]]; then
     :
   elif [[ $answer == [Nn] ]]; then
     :
   fi
   ;;
  Others)
   read -rp "Really use? $value [Y/N] " answer
   [[ $answer ]] || { echo "No answer!" >&2; exit 1; }
   if [[ $answer == [Yy] ]]; then
     :
   elif [[ $answer == [Nn] ]]; then
     :
   fi
   ;;
esac

출력은 다음과 같습니다.https://i.stack.imgur.com/RO9E5.png:if 문 내에서는 아무 작업도 수행되지 않습니다. 코드/프로세스 또는 대답이 다음과 같은 경우 수행하려는 작업으로 바꾸십시오. 이 :정도면 시작하기에 충분합니다. 그건 그렇고, 어딘가에 모션 캡처 코드가 게시되어 있는 것을 발견하고 일부 구문을 확장/다시 작성했습니다.[Yy][Nn]

관련 정보