シェルのコマンド履歴から各コマンドに個別にアクセスできるように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

関連情報