bash - 如何捕获输入来控制截图功能?
问题描述
我想捕获输入以控制屏幕截图功能。
vim myscreenshot.sh
screenshot(){
ffmpeg -video_size 1920x1080 -framerate 25 -f x11grab -i :0.0+0,0 /tmp/out.mp4
}
close(){
echo "screenshot is over"
exit
}
trap 'screenshot' ctrl+a #how to fix it?
trap 'close' ctrl+b #how to fix it?
该命令trap 'screenshot' SIGINT
可以陷阱ctrl+c
。
我的要求:输入ctrl+a
启动截图功能,停止截图功能并在后台ctrl+b
运行后退出。bash myscreenshot.sh &
解决方案
Bash 陷阱不是处理键盘输入的方法;他们处理信号。它适用于Ctrl+因为您的终端(不是 Bash)被配置为在按下该组合键时向CBash发送 SIGINT 信号(运行以查看所有此类绑定)。但是信号并非设计用于以这种方式使用。应该几乎总是用来中断和终止程序。stty -a
trap ... SIGINT
正如@MarkSetchell 建议的那样,bind
是配置键绑定的正确工具,如Ctrl+ A(符号:) C-a。该手册包含有关您可以配置的现有绑定的更多详细信息(特别是参见“杂项命令”,它提供了一些有用的行为,例如Esc Ctrl+ A( M-C-e),它扩展了当前待处理命令中的所有变量)。请注意,默认情况下C-a绑定到beginning-of-line
,并且C-b绑定到backward-char
。Readline手册更详细,因为这实际上是造成所有这些行为的原因。网上也有很多关于获取的文章和示例bind
做不同的事情,所以简单地搜索“bind”而不是“trap”可能就足以让你去:)
您可以尝试以下几个示例:
bind "\C-a":display-shell-version
将导致Ctrl+A调用display-shell-version
打印当前 Bash 版本的 readline 函数,而不是将光标跳转到行首。bind -x '"\C-b":"echo Hello World"'
(注意-x
)将导致Ctrl+B调用 shell 命令echo Hello World
,而不是将光标移回一个字符。
听起来您想配置任意键绑定,由于涉及的层不同,您可能会发现这是一场艰苦的战斗。用“正确”编程语言编写的专用 GUI 感知程序可以监视您的键盘,这将更适合您所描述的内容。显然,这比与 Bash 摔跤更费力,所以希望你能从中得到一些足够好的东西bind
:)
推荐阅读
- google-apps-script - 无法使用 Apps 脚本在移动设备中访问电子表格发布的 Web HTML
- shell - maven deploy:文件在nexus中上传工件时创建了太多文件夹
- laravel - 在存储函数 laravel 中添加值
- flutter - 如何在 FLUTTER 的 onTap 事件中更改 Container 的颜色和文本
- html - 如何通过按钮单击角度 8 中的 ngFor 表将对象推送到新数组
- javascript - 如何在 amCharts 上同时显示月份和年份?
- c++ - 使用flock(2)锁定文件时,为什么要创建锁定文件?
- google-apps-script - Gmail 加载项错误:SubmitFormResponseMarkup 不允许使用值:card_navigations
- dns - OVH 专用服务器上的高可用性
- xcode - 在最新的 Xcode 版本 11.2.1 中找不到 iPhone 7、iPhone 7 Plus 和更低模式的设备