如何执行 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