首页 > 解决方案 > 如何捕获输入来控制截图功能?

问题描述

我想捕获输入以控制屏幕截图功能。

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 &

标签: bashbash-trap

解决方案


Bash 陷阱不是处理键盘输入的方法;他们处理信号。它适用于Ctrl+因为您的终端(不是 Bash)被配置为在按下该组合键时CBash发送 SIGINT 信号(运行以查看所有此类绑定)。但是信号并非设计用于以这种方式使用。应该几乎总是用来中断和终止程序stty -atrap ... 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:)


推荐阅读