Bash:如何将命令输出到下一个提示符供用户使用?

Bash:如何将命令输出到下一个提示符供用户使用?

在 bash 脚本中,我想在末尾输出一个命令,因此用户只需Enter在我的脚本结束后按下即可执行该命令。

例如,用户需要执行带有特定参数的命令。我的脚本无需自己输入命令,而是将命令和参数输出到命令行,然后退出。此时我的脚本已完成。用户会看到一个新提示,其中的命令已“预先写好”。

这张动图应该能让你了解我所说的内容:

例子

我在几个程序中看到了这种行为赫斯特卡塔尔金融中心,我认为即使是标准反向搜索可以。

我用 Google 搜索了所有我能想到的答案,但还是找不到答案。

答案1

如果您正在使用 X,工具工具可能是一个解决方案,通过在脚本中包含以下命令:

xdotool type command-line-to-display

如果新文本与脚本输出混合,则可能需要一些技巧。

答案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,但你可以编写自己的文件)。也可以对其进行配置(请参阅输入rcreadline 手册)这样你就可以选择Emacs风格和Ctrl-style 编辑,并允许您在历史文件中向前( + r)或向后(Ctrl+ )搜索匹配项s,编辑命令等等。

我已经添加了stty-ixon/设置ixon选项,因为大多数终端仿真器会拦截控制序列Ctrl+rCtrl+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。

相关内容