如何捕获输入来控制截图功能?

How to trap input to control the screenshot function?

我想捕获输入来控制截图功能。

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
我的requirement:input ctrl+a 启动截图功能,ctrl+b 停止截图功能并在后台运行 bash myscreenshot.sh & 后退出。

Bash陷阱不是处理键盘输入的方法;他们处理 signals. It works for Ctrl+C because your terminal (not Bash) is configured to send a SIGINT signal to Bash when that key combination is pressed (run stty -a to see all such bindings). But signals aren't designed to be used in this way. trap ... SIGINT should almost always be used to interrupt and terminate the program.

正如@MarkSetchell 所建议的那样,bind is the right tool for configuring key bindings like Ctrl+A (notation: C-a). The manual has more details about existing bindings you can configure (see the "Miscellaneous Commands" in particular, which provides some useful behavior like Esc Ctrl+A (M-C-e) which expands all variables in the current pending command). Notice that C-a is bound to beginning-of-line by default, and C-b is bound to backward-char. The Readline manual 进行了更详细的介绍,因为这是所有这些行为的实际原因。网上还有很多关于让 bind 做不同事情的文章和示例,因此只需搜索 "bind" 而不是 "trap" 可能就足以让你开始了:)

您可以尝试以下几个示例:

  • bind "\C-a":display-shell-version 将导致 Ctrl+A 调用 readline 函数 display-shell-version 打印当前 Bash 版本,而不是将光标跳到行的开头。
  • bind -x '"\C-b":"echo Hello World"'(注意 -x)将导致 Ctrl+B 调用 shell 命令 echo Hello World,而不是将光标向后移动一个字符。

听起来您想配置任意键绑定,由于涉及不同的层,您可能会发现这有点艰巨。用 "proper" 编程语言编写的专用 GUI 感知程序可以监视您的键盘,它更适合您所描述的内容。显然,这比与 Bash 搏斗更多的工作,所以希望你能从 bind 中得到足够好的东西 :)

作为在 shell 提示符下使用 readline 的替代方法,请考虑以下 bash 解决方案。解决方案紧密匹配需求。基本上:

永远循环:

  • 等待Ctrl/A
  • 在背景中开始截图
  • 等待Ctrl/B
  • 停止截屏,运行外部screenshot.sh

它使用bash一次读取一个字符需要行分隔符。

旁注:在带有专用终端的 window 中给定程序 运行,Ctrl/A 和 Ctrl/B 可以用更简单的东西替换 - 只是 'A' 和 'B'.

#! /bin/bash

screenshot(){
    rm -f /tmp/out.mp4
    exec ffmpeg -video_size 1920x1080 -framerate 25 -f x11grab -i :0.0+0,0   /tmp/out.mp4
}

while true ; do
    a=""
    echo "Type CTRL/A to start"
    while [ "$a" != $'\x01' ] ; do
        read -N1 a
    done
    screenshot &
    sleep 3
    echo
    echo "Type CTRL/B to start"
    while [ "$a" != $'\x02' ] ; do
            read -N1 a
    done
    echo "Processing ..."
    kill $!
    bash myscreenshot.sh &
done

Ctrl+A 不会产生信号,Bash陷阱不是处理键盘输入的方法;他们处理信号。它适用于 Ctrl+C,因为不是 Bash,但您的终端配置为在按下组合键时向 Bash 发送 SIGINT 信号,您可以通过 [=18= 进行检查]stty -a。所以最简单的方法是你无法捕获它。

你也可以看看这个例子:

bind "\C-a":display-shell-version 将导致 Ctrl+A 打印当前 Bash 版本,而不是将光标跳到行首。 bind -x '"\C-b":"echo Hello World"'(注意 -x)将导致 Ctrl+B 调用 shell 命令 echo Hello World.

也可以考虑运行 帮助绑定