Execute o script bash para que cada comando seja acessível individualmente no histórico de comandos do shell

1

Como posso executar um script bash de tal forma que cada um dos comandos no script bash possa ser selecionado usando a seta para cima após a execução?

Exemplo de script:

#!/bin/bash

command #1
command #2
command #3

Agora, depois de executar este script, gostaria de poder selecionar cada comando individualmente usando a seta para cima.

    
por daka 03.04.2017 / 12:20

2 respostas

4

A maneira mais simples de pensar nisso é com:

exec < <(cat /path/to/script; echo 'exec </dev/tty')

Basicamente, o bash só vai acrescentar à história coisas que entram no STDIN. Então a solução é alimentar o script para STDIN. O problema é que, depois de ler o script, o bash receberá EOF e sairá. Para resolver isso, colocamos o exec </dev/tty para que ele retorne o STDIN para o TTY quando terminar de ler o script.
Infelizmente isso significa que exec </dev/tty será a última coisa em sua história, então você terá que passar por isso. Se você quiser, pode se livrar disso fazendo echo 'exec </dev/tty; history -d $((HISTCMD-1))' . Mas começa a fazer o comando um pouco longo. Mas se você for adicionar uma função de shell personalizada para fazer isso, talvez não seja um grande problema. Por exemplo:

function infile() {
  exec < <(cat "$1"; echo 'exec </dev/tty; history -d $((HISTCMD-1))')
}

O uso seria então:

infile /path/to/script
    
por 03.04.2017 / 14:32
0

Aqui está uma versão usando dialog . Instale se estiver faltando com apt-get install dialog ou yum install dialog

Parece algo assim:

┌────────────────────── Choose one ────────────────────────
│ Move using [UP] [DOWN], [Enter] to select                │  
│ ┌──────────────────────────────────────────────────────┐ │  
│ │                   ls    Do a ls                      │ │  
│ │                   w     Call w                       │ │  
│ │                   who   Start who                    │ │  
│ │                   exit  Exit                         │ │  
│ │                                                      │ │  
│ │                                                      │ │  
│ │                                                      │ │  
│ │                                                      │ │  
│ │                                                      │ │  
│ │                                                      │ │  
│ └──────────────────────────────────────────────────────┘ │  
├──────────────────────────────────────────────────────────┤  
│               <  OK  >        < Quit >                   │  
└──────────────────────────────────────────────────────────┘ 

Fonte:

#!/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
    
por 03.04.2017 / 13:21