실행 후 위쪽 화살표를 사용하여 bash 스크립트의 각 명령을 선택할 수 있도록 bash 스크립트를 어떻게 실행할 수 있습니까?
예시 스크립트:
#!/bin/bash
command #1
command #2
command #3
이제 이 스크립트를 실행한 후 위쪽 화살표를 사용하여 각 명령을 개별적으로 선택할 수 있기를 원합니다.
답변1
내가 생각할 수 있는 가장 간단한 방법은 다음과 같습니다.
exec < <(cat /path/to/script; echo 'exec </dev/tty')
기본적으로 bash는 STDIN에 나타나는 기록에만 추가됩니다. 따라서 해결책은 스크립트를 STDIN에 공급하는 것입니다. 문제는 스크립트를 읽은 후 bash가 EOF를 얻은 다음 종료된다는 것입니다. 이 문제를 해결하기 위해 exec </dev/tty
스크립트를 읽은 후 STDIN이 다시 TTY로 전환되도록 배치했습니다.
불행하게도 이것은 이것이 당신의 역사에서 마지막 일이라는 것을 의미하므로 exec </dev/tty
건너뛰어야 합니다. 원한다면 다음을 수행하여 이 문제를 제거할 수 있습니다 echo 'exec </dev/tty; history -d $((HISTCMD-1))'
. 하지만 명령이 꽤 길어지기 시작합니다. 그러나 이를 수행하기 위해 사용자 정의 셸 기능을 추가한다면 별 문제가 아닐 수도 있습니다. 예를 들어:
function infile() {
exec < <(cat "$1"; echo 'exec </dev/tty; history -d $((HISTCMD-1))')
}
그러면 사용법은 다음과 같습니다.
infile /path/to/script
답변2
이것은 중고 버전입니다 dialog
. 누락된 경우 apt-get install dialog
또는 설치yum install dialog
다음과 같습니다.
┌────────────────────── Choose one ────────────────────────
│ Move using [UP] [DOWN], [Enter] to select │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ ls Do a ls │ │
│ │ w Call w │ │
│ │ who Start who │ │
│ │ exit Exit │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────────┤
│ < OK > < Quit > │
└──────────────────────────────────────────────────────────┘
원천:
#!/usr/bin/env bash
_temp="/tmp/answer.$$"
dialog --backtitle "Blah menu" --title " Choose one "\
--cancel-label "Quit" \
--menu "Move using [UP] [DOWN], [Enter] to select" 17 60 10\
ls "Do a ls"\
w "Call w"\
who "Start who"\
exit "Exit" 2>$_temp
if [ $? -ne 0 ]; then
rm $_temp
exit $?
fi
menuitem=$(cat $_temp)
rm $_temp
clear
$menuitem