执行 bash 脚本,以便可以在 shell 的命令历史记录中单独访问每个命令

执行 bash 脚本,以便可以在 shell 的命令历史记录中单独访问每个命令

如何执行 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))'。但它开始使命令变得相当长。但如果您要添加自定义 shell 函数来执行此操作,则可能不是什么大问题。例如:

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

相关内容