화살표 키와 Enter를 사용하여 탐색할 수 있는 인라인 메뉴를 셸에 표시하는 도구를 찾고 있습니다. "인라인"은 메뉴가 표준 출력 텍스트의 일반적인 흐름 내에 표시된다는 것을 의미합니다.아니요모든 것 위에 팝업 대화 상자가 있습니다.
겨우 찾았어그 게시물이 문제를 해결하려고 시도했지만 사용자 정의 스크립트나 인라인이 아닌/팝업 솔루션(예: dialog
또는 zenity
)만 언급되었습니다.
내가 찾고 있는 것은 apt-get
Docker 이미지에 사용하거나 간단히 설치 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
매우 기본적인 방법은 bash
의 select
문을 사용하는 것입니다. 다른 것을 설치할 필요가 없습니다. 방금 얻은 예는 다음과 같습니다.
#!/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]