Получение Снимка экрана терминального приложения с помощью сценария оболочки?

В двойных кавычках, символах $"\` останьтесь особенными. Можно путать их с одинарными кавычками: в одинарных кавычках все символы интерпретируются буквально, за исключением ' самостоятельно, который заканчивает строковый литерал.

$ cat /opt/jira/.subversion/config | grep -P "$[^#]"
zsh: bad math expression: operand expected at `^#'

$[…] синтаксис устаревший для арифметических выражений, которые могут быть записаны $((…)) как в оболочках POSIX. ^# не допустимое арифметическое выражение; оболочка ожидала операнд, такой как число или имя переменной.

[1]    broken pipe  cat /opt/jira/.subversion/config

Начиная со второй команды в конвейере, прерванном прежде, чем использовать весь вывод от cat (это даже не начало читать), первая команда (cat) полученный SIGPIPE.

$ cat /opt/jira/.subversion/config | grep -P "\$[^#]"
$ cat /opt/jira/.subversion/config | grep -P "\$#"

Обратная косая черта говорит оболочке интерпретировать следующий символ буквально, таким образом, grep видел шаблон $[^#] или $#. Эти шаблоны означают “конец строки, сопровождаемой любым символом кроме #” и “конец строки, сопровождаемой #” соответственно. Ни один из этих шаблонов ничему не может соответствовать.

$ cat /opt/jira/.subversion/config | grep -P "$#"

$# количество позиционных параметров ($1, $2, …, коллективно доступный как $@), т.е. аргументы передали командную строку оболочки или аргументы функции если в функции. В интерактивной оболочке обычно нет никаких позиционных параметров, таким образом, grep видел шаблон 0.

Шаблон, который Вы ищете, ^[^#] (^ соответствия в начале строки). Если Вы не означаете включать значение переменной оболочки или вывод команды в шаблоне, используйте одинарные кавычки (это не имеет значения здесь, но это имеет значение для некоторых шаблонов, особенно те, которые содержат обратную косую черту или a $). Вам не нужно -P поскольку этот шаблон записан таким же образом в основном regexps (плоскость grep), расширенный regexps (grep -E) и жемчуг regexps (grep -P).

$ 

4
26.09.2013, 16:40
3 ответа

Я не думаю, что Вы сможете сделать это с screen если вывод на самом деле не представляется в окне, которое, вероятно, побеждает точку использования экрана. Однако окно не должно быть на переднем плане.

Комплект ImageMagick содержит названную утилиту import можно использовать для этого. Если import --help дает Вы "управляете не найденный", устанавливает imagemagick пакет, это будет доступно в любом дистрибутиве Linux.

import нуждается в названии окна. iftop терминальный интерфейс, так чтобы удостовериться, что Вы используете правильное имя, необходимо будет установить заголовок терминала GUI, в котором это работает. Как Вы делаете, который зависит, на котором терминале GUI Вы используете. Например, я предпочитаю Терминал XFCE, который был бы:

Terminal -T Iftop -e iftop

Открывает новое терминальное выполнение iftop с заголовком "Iftop". Снимок экрана этого может быть сделан:

import -window Iftop ss.jpg

Если Вы собираетесь сделать это каждые пять секунд, Вы, вероятно, хотите вместо этого открыть окно, запускающее скрипт, таким образом, можно снова использовать тот же терминал:

count=0;
while ((1)); do
    iftop &
    pid=$!
    sleep 1  # make sure iftop is up
    count=$(($count+1))
    import -window Iftop iftop_sshot$count.jpg
    kill $pid
    sleep 5
done

Если бы сценарий является "iftopSShot.sh" затем, Вы запустили бы это Terminal -T Iftop -e iftopSShot.sh - кроме Вы, вероятно, не используете Terminal. Большинство терминалов GUI Linux связано с определенным DE's, хотя они - автономные приложения, которые могут использоваться независимо. Я полагаю, что название терминала по умолчанию на KDE Konsole и это следует -T и -e конвенции; для GNOME это, вероятно, gnome-terminal (это, возможно, изменилось), и это, кажется, использует -t и нет -T.

Остерегайтесь import значением по умолчанию звонит в звонок, который станет раздражающим, но существует a -silent опция.

1
27.01.2020, 21:02

Несколько идей:

  1. Вы могли использовать этот сценарий от обвиненного названный: инструмент Screenshot для повторяющегося screenshotting.

    #!/bin/bash
    # Screenshot tool for TIMS.
    #
    # -------------------------
    #
    # By regj 2012.05
    #
    # -------------------------
    #
    # Check for config file create if needed with sane defaults then exit.
    if [ ! -f $HOME/.scrotter ]; then
        echo "Creating scrotter config file ${HOME}/.scrotter"
        echo "scrotfldrbase=${HOME}/Desktop/scrots" > $HOME/.scrotter
        echo "fontsize=14" >> $HOME/.scrotter 
        echo "fillcolor=white" >> $HOME/.scrotter 
        echo "whiteterm=yes" >> $HOME/.scrotter
        echo "subw=130" >> $HOME/.scrotter
        echo "subh=5" >> $HOME/.scrotter
        echo "fontpath=/usr/share/fonts/dejavu/DejaVuSansMono.ttf" >> $HOME/.scrotter
        if [ $? = 0 ] ; then
            echo -e "Config file succesfully created. Adjust values if needed in ~/.scrotter.\nIf you use a black term background set whiteterm to no."
            echo "Current values:"
            cat $HOME/.scrotter
            echo "Rerun scrotter with --server-id if initial run"
            exit 0
        else
            echo "Something went wrong"
            exit 1
        fi
    fi
    
    # Source config file
    source $HOME/.scrotter
    
    # convert functions for white or black terminal
    conv_black () {
    convert -pointsize $fontsize \
        -font $fontpath \
        -fill $fillcolor \
        -draw "text ${xyplace} \"$(date "+%Y.%m.%d %H:%M"|sed -e ' s/\"/\\\"/g' )\"" \
        $scrotfldr/$srvid-$count.png $scrotfldr/$srvid-$count.png 
    }
    
    conv_white () {
    convert -pointsize $fontsize \
            -font $fontpath \
            -fill $fillcolor \
        -stroke black \
        -strokewidth 1 \
            -draw "text ${xyplace} \"$(date "+%Y.%m.%d %H:%M"|sed -e ' s/\"/\\\"/g' )\"" \
            $scrotfldr/$srvid-$count.png $scrotfldr/$srvid-$count.png
    }
    
    
    # Options
    case $1 in
    
    --server-id) echo "Setting srvid" ; echo $2 > /tmp/${USER}-scrot-srvid ; exit 0;;
    --reset-count) echo "0" > /tmp/$USER-scrot-count ; exit 0;;
    --clean-up) rm -f $scrotfldr/*.png ; rm -f /tmp/${USER}-scrot-* ; exit 0 ;;
    --help) echo "Options are:
            --server-id: Set servername used in test.
            --reset-count: Reset counter for enumerating png's.
            --clean-up: Delete png's in current serverfolder and reset counters and serverid.
            --help: This info." 
            exit 0;;
    
    # Uncomment below if you want to remove everything in your scrot folder with this script
    #--clean-all) if [ -z $scrotfldrbase ]; then 
    #       echo "Exiting .." ; exit 1
    #        fi 
    #       echo "NB: $scrotfldrbase will be removed recursively!"  
    #       rm -rI $scrotfldrbase/*  
    #       rm -f /tmp/${USER}-scrot-*
    #       exit 0 ;;
    
    esac
    
    # Check if serverid is defined, use if yes
    if [ -s /tmp/${USER}-scrot-srvid ]; then
        srvid=$(cat /tmp/${USER}-scrot-srvid)
        scrotfldr=$HOME/Desktop/scrots/$srvid
    else
        echo "Please set server id with --server-id option. # scrotter --server-id <servername>"
        exit 1
    fi
    
    # Check if root, exit if yes.
    if [ $(id -u) = 0 ]; then
        echo "Do not run as root!"
        exit 1
    fi
    
    # Create count file
    if [ ! -f /tmp/${USER}-scrot-count ]; then
        echo "0" > /tmp/$USER-scrot-count
    fi
    
    # Create Screenshot folder if not present
    if [ ! -d $scrotfldr ];  then
        mkdir -p $scrotfldr
    fi
    
    # Get active window ID
    activewin=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | grep "window id" )
    activewinid=${activewin:40}
    
    # Get geometry of window
    geowinw=$(xwininfo -id ${activewinid} | awk '/Width/ {print $2}')
    geowinh=$(xwininfo -id ${activewinid} | awk '/Height/ {print $2}')
    
    # Define X,Y placment of date text
    xyplace="$(($geowinw - $subw)),$(($geowinh - $subh))"
    
    # Get current count
    count=$(cat /tmp/${USER}-scrot-count)
    
    # Take screenshot
    import -window "$activewinid" $scrotfldr/$srvid-$count.png
    
    # Insert date stamp into screenshot use xyplace variable to adjust placement
    if [ $whiteterm = yes ] ; then
        conv_white
    else
        conv_black
    fi
    
    # Increment counter
    echo $(($count+1)) > /tmp/$USER-scrot-count
    

    Поместите вышеупомянутое в названный файл scrotter и сделайте это исполняемым файлом. Когда Вы выполняете его в первый раз:

    $ ./scotter
    Creating scrotter config file /home/saml/.scrotter
    Config file succesfully created. Adjust values if needed in ~/.scrotter.
    If you use a black term background set whiteterm to no.
    Current values:
    scrotfldrbase=/home/saml/Desktop/scrots
    fontsize=14
    fillcolor=white
    whiteterm=yes
    subw=130
    subh=5
    fontpath=/usr/share/fonts/dejavu/DejaVuSansMono.ttf
    Rerun scrotter with --server-id if initial run
    

    При выполнении его в 2-й раз Вы получите использование:

    $ ./scrotter 
    Please set server id with --server-id option. # scrotter --server-id <servername>
    

    Теперь выполните его с a --server-id blah, и начните делать снимки экрана:

    $ ./scrotter --server-id blah
    $ ./scrotter
    

    Это сделает снимки экрана активного окна. Это было бы изменено в структуру цикличного выполнения или изменено непосредственно!

  2. Вы могли использовать команду импорта, чтобы сделать снимок экрана и перенести это в любой тип цикла, который Вы любите (за, whilte, и т.д.) в зависимости от Ваших потребностей. Этот aritcle, Снимки экрана Таймлапса, имеет все, в чем Вы нуждаетесь, я не думаю, что Вы хотите сделать сценарий выполненным из крона, но все остальное кажется применимым.

    Например:

    # takes screenshot
    $ import -window root -display :0 -crop 958x490+20+128 "savedfiles/screenshot_$(date +%d%m%y-%H.%M).png"
    
    # makes a video out of a bunch of them
    $ mencoder "mf://screamshots/*.png" -mf fps=10 -o test.avi -ovc lavc -lavcopts vcodec=msmpeg4v2:vbitrate=800
    
0
27.01.2020, 21:02

В среде X :


Динамически установить название терминала:

Из нашего скрипта способ изменить заголовок терминала с помощью последовательностей ansi:

echo -e "\033]0;Term | myApp\007";

Захват png по заголовку окна:

Теперь мы можем искать id окна по точному заголовку с помощью wmctrlи передавать id утилите import:

import -window $(wmctrl -l | grep -i 'Term | myApp' | awk '{print $1}') ~/Pictures/capture.png

Создать gif:

Пример настройки: делайте 5 снимков каждую секунду, а затем преобразуйте их в gif с помощью convertв бесконечном двухсекундном цикле.

rm -f /tmp/*png && for i in {1..5}; do import -window $(wmctrl -l | grep -i 'Term | myApp' | awk '{print $1}') /tmp/$i.png && sleep 1; done && convert -delay 200 -loop 0 /tmp/*.png animation.gif
2
07.05.2020, 12:53

Теги

Похожие вопросы