如何捕获输入来控制截图功能?
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.
也可以考虑运行 帮助绑定
我想捕获输入来控制截图功能。
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.
也可以考虑运行 帮助绑定