如何制作一个linux 里好用的截屏脚本?
1 前期准备:xwininfo命令
xwininfo命令的功能是显示选中窗口的大小和坐标信息,如下所示,这里的关键信息便是我们选中窗口的坐标和宽度;
user@user☆ :~$ xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0x520000a "user@user: ~"
Absolute upper-left X: 111
Absolute upper-left Y: 297
Relative upper-left X: 0
Relative upper-left Y: 0
Width: 732
Height: 699
Depth: 32
Visual: 0x165
Visual Class: TrueColor
Border width: 0
Class: InputOutput
Colormap: 0x5200009 (not installed)
Bit Gravity State: NorthWestGravity
Window Gravity State: NorthWestGravity
Backing Store State: NotUseful
Save Under State: no
Map State: IsViewable
Override Redirect State: no
Corners: +111+297 -837+297 -837-54 +111-54
-geometry 80x41+101-44
2 前期准备:byzanz工具
byzanz是一个轻量级的截屏工具,可以用来生成清晰的gif动态效果图!
我们记录几个重要的参数信息:
-d, --duration=SECS 动画的时间 (默认:10 秒)
-e, --exec=COMMAND Command to execute and time
--delay=SECS 开始之前的延时(默认:1 秒)
-c, --cursor 录制鼠标光标
-a, --audio 录音
-x, --x=像素 要录制矩形的 X 坐标
-y, --y=像素 要录制矩形的 Y 坐标
-w, --width=像素 录制矩形的宽度
-h, --height=像素 录制矩形的高度
-v, --verbose 详细
--display=显示 要使用的 X 显示
3 制作脚本思路
由上面讲解可知byzanz是一个非常不错的制作截屏的工具,但是有一个弊病,所有的截屏参数需要手动输入,否则使用的截屏就是全局截屏
。为了让截屏更好用就必须搭配xwininfo
,且要让xwininfo的数据能通过脚本自动传递给byzanz。
所以思路很清晰,写一个脚本整合xwininfo和byzanz,让我们选择录屏的功能通过一个无参的窗口简单的完成!
这里思路很简单,使用awk
,通过字符串分割的方式,直接拿到x、y坐标、宽、高的字符串!
var=$(xwininfo | awk -F ":" '/Absolute upper-left X/ || /Absolute upper-left Y/ || /Width/ || /Height/{print $2}')
拿到坐标和宽高后,剩下的工作就是把他们参数化,传递给byzanz-record,这里使用read命令,通过管道重定向结果到四个变量:
read x y w h < <(echo $var)
这里read有个值得注意的点,传入的参数采用的重定向符号如下:
< <(echo $var)
;正常的百度你肯能都搜索不到这种小于号+下括号
,本人也是根据shell脚本插件写出来的!个人认为可以将命令解释如下:
- <(echo $var)表示将(echo $var)这个命令的输出作为重定向输入信号;
- < 将随后输入信号再次重定向至read;
4 制作脚本展示
如图所示为本人编写的制作脚本,其中支持5、 10、20s的录制时间,并将只做好的gif存入本地Pictures目录:
produce_gif()
{
var=$(xwininfo | awk -F ":" '/Absolute upper-left X/ || /Absolute upper-left Y/ ||
/Width/ || /Height/{print $2}')
echo "$var"
set -e
read -t 5 -p "do you want to screen shot the window and get a gif ?" ans1
if [[ $ans1 == "yes" ]];then
read x y w h < <(echo $var)
byzanz-record -d $1 -x $x -y $y -w $w -h $h /home/user/Pictures/byzanz-user.gif
fi
set +e
}
usage()
{
cat <<EOF
xwin-gif [options]
[options]
-d remove tem cache of byzanz
-1 5s gif
-2 10s gif
EOF
}
[ -z "$1" ] && usage && exit -1
while getopts "12d" opt
do
case $opt in
d)echo "delete byzanz cache:"
ls -l /tmp/*byzanz*
;;
1)echo "start 5s gif!"
produce_gif 5
;;
2)echo "start 10s gif!"
produce_gif 10
;;
?)echo "start default:20s gif!"
produce_gif 20
;;
esac
done
5 小结
制作一个好用的gif录屏工具脚本,实际上还是一个通过shell将xwininfo、byzanz以及awk和read结合使用的过程,通过awk识别窗口参数,read读取参数,最终完成了零输入和配置的gif制作脚本!
这里值得学习一下的是read x y w h < <(echo $var)
语句,我相信以后还有许多地方要用到它,特此记录!
6 扩展:输入重定向
Bash 支持的输出重定向符号总结如下
符号 | 说明 |
---|---|
command <file | 将 file 文件中的内容作为 command 的输入。 |
command <<END | 从标准输入(键盘)中读取数据,直到遇见分界符 END 才停止(分界符可以是任意的字符串,用户自己定义)。 |
command file2 | 将 file1 作为 command 的输入,并将 command 的处理结果输出到 file2。 |
下面我们简单用一下用法:
fwd@fwd☆ :~/bin$ cat ding
a
b
c
fwd@fwd☆ :~/bin$ wc -l <ding
4
fwd@fwd☆ :~/bin$ wc -l <<end
> d
> s
> end
2
fwd@fwd☆ :~/bin$ wc -l <ding >ding1
fwd@fwd☆ :~/bin$ cat ding1
4
最后也不要忘记了新近学习的一种:
fwd@fwd☆ :~/bin$ wc -l < <(cat ding)
4
最后的最后
ps:如果你有关于< <()更好的解释,不吝赐教,谢谢了!