在一个bash脚本中,当脚本退出后,在提示符上打印命令(作为建议)。

3
我想编写一个shell脚本,可以在命令行提示符后打印出建议的命令。然后,在脚本退出后,用户只需按[enter]键即可运行建议的命令。
考虑到我对bash不熟悉,甚至不知道是否可能实现这一点。我考虑使用复制-粘贴命令,移动光标,使用$PS1变量,但没有找到合适的方法...
有人知道如何实现这个功能吗?

只需将其打印到标准输出并让他们复制粘贴吗?在退出之前询问他们是否想运行它,如果他们回答是,则为他们运行它? - Etan Reisner
我认为这是不可能的。readline没有提供一种以编程方式向输入缓冲区添加文本的方法。 - chepner
可能可以使用类似xte的工具在后台运行延迟脚本时输入终端命令,但这不是一个实际可行的解决方案。如果在脚本运行时shell失去焦点,新聚焦的窗口将会出现(看似)随机的按键操作。 - Lando
我刚刚测试了一下。你可以使用xte来“模拟”一个按键到shell中,因此可以将此功能构建到bash脚本中,但它可能会有错误和不稳定性。这是我快速测试的片段:(注释中的格式。) `01:43 PM lando ~ xte 'key v'; xte 'key i'; xte 'key m'vim01:43 PM lando ~ vim ` - Lando
@Landen 感谢您的建议,我已经成功地获得了所需的行为! - beesleep
1个回答

2

根据评论中Landen的建议(非常感谢!),我已经成功解决了我的问题。

这个解决方法需要使用xautomation软件包(xte命令,模拟按键),不是非常健壮,并且可能依赖于xautomation的键盘布局处理和系统快捷键。例如,我必须更改Unity HUD的快捷键。

但是考虑到我的命令非常快,并且主要是为了个人使用,这个解决方案完全满足我的需求:

COMMAND_PASSED='sudo apt-get update'

# Displays the content of $COMMAND_PASSED on the next prompt
xte "str $COMMAND_PASSED"
sleep 0.1
tput cub ${#COMMAND_PASSED}

sleep 0.1tput cub ${#COMMAND_PASSED}命令可以防止在命令提示符之前显示按键。

sleep 0.1让整个命令在提示符之前打印出来。

tput cub ${#COMMAND_PASSED}将光标向后移动,以确保所有不必要的输出都被擦除。

谢谢大家!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接