쉘의 명령 기록에서 각 명령에 개별적으로 액세스할 수 있도록 bash 스크립트를 실행합니다.

쉘의 명령 기록에서 각 명령에 개별적으로 액세스할 수 있도록 bash 스크립트를 실행합니다.

실행 후 위쪽 화살표를 사용하여 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

관련 정보