如何制作一个linux 里好用的截屏脚本?

如何制作一个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:如果你有关于< <()更好的解释,不吝赐教,谢谢了!

发布了88 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xinquanv1/article/details/102612827
今日推荐