答案1
答案2
在 Bash 脚本末尾添加以下行:
MY_COMMAND="ls"
MY_PARAMS=()
read -a MY_PARAMS -p $MY_COMMAND
exec $MY_COMMAND ${MY_PARAMS[@]}
假设您要执行的命令是ls,请根据需要进行更改。您输入的内容将存储为名为我的参数,由第一行初始化;然后通过重复命令,然后扩展数组变量(即其所有元素)来执行命令。以上内容与您传递给命令的元素数量无关。exec shell 命令用给定的命令替换 shell,从而有效地终止脚本。
编辑:
如果你想为你的脚本添加完整的命令编辑功能,那么读取-e提供,您可以执行以下操作:安装右包裹,然后在 Bash 脚本底部添加以下代码:
stty -ixon
MYINPUT=()
HISTORY=$HOME/.bash_history
MYCOMMAND="ls"
MYINPUT=$(rlwrap -H $HISTORY -P $MYCOMMAND sh -c 'read REPLY && echo $REPLY')
stty ixon
exec sh -c "${MYINPUT[@]}"
右包裹是一个能够使用所有功能的程序阅读行,不像非常差的 Bash读取-e选项。它允许你指定一个文件来搜索可能的补全(我使用了 Bash 历史记录,$HOME/.bash_history,但你可以编写自己的文件)。也可以对其进行配置(请参阅输入rc节readline 手册)这样你就可以选择Emacs风格和六Ctrl-style 编辑,并允许您在历史文件中向前( + r)或向后(Ctrl+ )搜索匹配项s,编辑命令等等。
我已经添加了stty-ixon/设置ixon选项,因为大多数终端仿真器会拦截控制序列Ctrl+r和Ctrl+s等等,这会暂时禁用此功能。
另外,您希望的命令(我使用了ls(仅用于说明目的)已预先加载,可以执行照原样(按回车键)或通过阅读行的能力右包裹。
以上内容不能所做的就是显示可能匹配的列表,以便您通过键盘进行选择。这需要一些 BASH 编程(请参阅迪尔克特的答案)。
答案3
这不是一个完整的答案,而是对您所看到内容的解释:
你可以通过检查来了解 qfc 是如何做到的qfc网站. 它利用了两个 shell 的特殊功能:嘚、zle
命令以及狂欢,READLINE_LINE
变量。此外,这两种变体都使用在 shell 中调用的函数,它们不只是启动脚本并在退出时提供该信息。
在脚本退出时以独立于 shell 的方式执行此操作是一个有趣的问题。:-)
答案4
这是一个简短的(丑陋?有缺陷?)实现,其中包含使用/for bash 的示例。
内联.sh:
inline () {
stty_backup=$(stty -g)
#I don't know why exactly, I just faced it
stty sane
res=$($READLINE_LINE 3>&1 >/dev/tty)
stty $stty_backup
READLINE_LINE=$res
READLINE_POINT=${#READLINE_LINE}
}
#the bind is Alt-!, you can change it
bind -x '"\e!":"inline"'
你好.sh:
#!/bin/bash
echo Do you want:
echo 1 past?
echo 2 present?
echo 3 futur?
read -p "1 or 2 or 3? " r
if [ "$r" = "1" ]; then r="uptime"
elif [ "$r" = "2" ]; then r="date"
elif [ "$r" = "3" ]; then r="fortune fortunes"
else r=""
fi
echo $r >&3
你的脚本需要足够智能,你想要在提示时返回的字符串必须通过 fd 3 返回(参见 inline.sh)。
现在,
source inline.sh
类型
./hello.sh
按 Alt-!
当然,您可以在 bashrc 中 source inline.sh。