SliTaz SliTaz Forum

You are not logged in.

#26 2012-11-03 10:04:01

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

> Я уже объяснял в одном из недавних постов

Значит общедоступным он станет (или не станет) в версии slitaz-4.1 так?

> Куда это прописать?

Моя не понимайт! Или так: Вам и карты в руки.

А как Вы делаете цитирование - серая вертикальная линия?

Offline

#27 2012-11-03 10:50:18

black dog
Member
Registered: 2011-04-09
Posts: 331

Re: screenshot снимок экрана

О цитировании:

[c]угловая скобка[/c]blockquote[c]угловая скобка[/c]текст цитаты[c]угловая скобка[/c]/blockquote[c]угловая скобка[/c]

Где-то была тема с примерами. Увижу - напишу.

Вот:

http://forum.slitaz.org/topic/using-the-codes

Offline

#28 2012-11-03 11:50:26

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

Где-то была тема с примерами/

Ля-ля-ля
Спасибо, black dog/

Вставляю текст в обрамлении code и /code в угловых скобках "<" ">" но не получается.

Получается только в "blockquote"

Но движок сайта что-то добавляет от себя, чего я не "квотил".

Буду по-почтовому цитировать одной угловой скобкой, так более предсказуемо.

Offline

#29 2012-11-03 14:40:35

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: screenshot снимок экрана

Значит общедоступным он станет (или не станет) в версии slitaz-4.1 так?

Какая ещё 4.1? ☺ Первый раз слышу. Переходите с 4.0 на Cooking и будете часто и сразу получать много вкусного! Именно Cooking — живая, постоянно улучшающаяся система. А 4.0 — это лишь веха на пути.

Насчёт оформления — сейчас напишу в новой теме и по-русски, раз уж английский топик есть.

Offline

#30 2012-11-03 18:32:41

nero
Member
Registered: 2012-04-23
Posts: 24

Re: screenshot снимок экрана

Переходите с 4.0 на Cooking

Пробывал, и не раз.

При загрузке с slitaz-rolling.iso - тупо вешалось с картинкой выбора локали

При обновлении установленной системы с 4.0 до Cooking - просто переставало загружаться(приходилось откатываться назад).

Ну и бросил эксперименты, если работает - то лучше не трогать)))

Но это было уже давненько, может это дело уже улучшилось.

На днях проверю

sudo tazpkg set-release cooking

Offline

#31 2012-11-05 18:48:04

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

Скрипт на bash для программы scrot

Отвечаю на свой вопрос сам: все дело в порядке ключей командной строки.

Должно быть: scrot  "grab-mode" "time-delay" "DIR-to-save-file"

"grab-mode"   -m или -s или -u

"time-delay"   -d 0 или 1 или 2 или ...

"DIR-to-save-file"   pwd из $FILE

Вот последний (?) вариант скрипта:

[c]#!/bin/bash
GTKDIALOG=gtkdialog

call() {
funccommand $COMBOBOX1 $COMBOBOX2
echo "call_COMMANDSTRING= $COMMANDSTRING"
scrot "$COMMANDSTRING"
}

funccommand () {
if [ "$COMBOBOX1" == "All" ]; then
COMMAND1="-m"
else COMMAND1="-s"
fi
if [ "$COMBOBOX1" == "Window" ]; then
COMMAND1="-u"
fi
echo "COMMAND1= $COMMAND1"
COMMAND2="$COMBOBOX2"
echo "COMMAND2= $COMMAND2"
COMMANDSTRING="$COMMAND1 -b -d $COMMAND2 -e 'mv $f ~'"
echo "COMMANDSTRING= $COMMANDSTRING"
echo "End of export variables."
}

export -f call
export -f funccommand

export MAIN_DIALOG='
<window title="SCReenshOT  screen-grabber">
    <vbox>
        <frame Command button EXIT>
            <hbox>
                <button cancel></button>
            </hbox>
        </frame>

        <frame User-settings>
            <hbox>
                <vbox>
                    <text>
                        <label>Select grab-mode</label>
                    </text>
                    <combobox>
                        <variable>COMBOBOX1</variable>
                        <item>All</item>
                        <item>Window</item>
                        <item>Area</item>
                        <action>save:COMBOBOX1</action>
                        <variable>COMMAND1</variable>
                    </combobox>
                </vbox>
                <vbox>
                    <text>
                        <label>Time-delay-sec</label>
                    </text>
                    <combobox>
                        <variable>COMBOBOX2</variable>
                        <item>0</item>
                        <item>1</item>
                        <item>2</item>
                        <item>3</item>
                        <item>5</item>
                        <item>10</item>
                        <item>20</item>
                        <action>save:COMBOBOX2</action>
                        <variable>COMMAND2</variable>
                    </combobox>
                </vbox>
                <button>
                    <label>ACCEPT</label>
                    <variable>GOMMANDSRING</variable>
                    <action>echo "Start of scrot:"</action>
                    <action>call </action>
                </button>
            </hbox>
        </frame>

        <frame Select DIR for save screenshot>
            <chooser>
                <height>200</height>
                <width>200</width>
                <variable>FILE</variable>
                <default>/home/</default>
                <action>cat [ echo $FILE ] | zenity --text-info  --width=250 --height=250 --title $FILE</action>
            </chooser>
        </frame>
    </vbox>
</window>
'

case $1 in
    -d | --dump) echo "$MAIN_DIALOG" ;;
    *) $GTKDIALOG --program=MAIN_DIALOG ;;
esac[/c]
Скрипт конечно надо еще немного "почистить", но в принципе он работающий.

Offline

#32 2012-11-05 19:15:03

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: screenshot снимок экрана

Сложно для восприятия как по мне.

[*]Тут и gtkdialog и zenity. Можно ли обойтись одним gtkdialog?

[*]Если удалить отладку при помощи echo, то будет чуть чище.

[*]В funccommand вместо двух условий if можно поставить case.

[*]export -f (экспорт функции в глобальные переменные) кажется, не работает в /bin/sh, а только в bash (которого по умолчанию нету)

Обход export -f я решал вызовом скриптом самого себя ($0) с дополнительным параметром. Потом этот параметр смотрелся в функции наподобие как в конце этого скрипта и вызывалась нужная функция.

Offline

#33 2012-11-05 19:53:48

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

Оказалось, что я несколько поторопился (делал и отлаживал в Юбунте).

1. gtkdialog version 0.7.20 - версия по умолчанию не знает вызова функций:

root@slitaz:~/Desktop/scrotdlg-bash2# ./scrotdlg3

Start of scrot:

sh: call: not found

root@slitaz:~/Desktop/scrotdlg-bash2# scrot -v

scrot version 0.8

root@slitaz:~/Desktop/scrotdlg-bash2# gtkdialog -v

gtkdialog version 0.7.20 (C) 2004, 2005, 2006, 2007 by Laszlo Pere

root@slitaz:~/Desktop/scrotdlg-bash2#

- нужна версия >= 0.8

2. > Можно ли обойтись одним gtkdialog?

Можно конечно. Но zenity в slitaz есть по умолчанию и есть не просит.

И потом zenity позволяет "прилепить" к основному окну file-chooser, а без него придется вызывать file-chooser как дочернее окно. По-моему "не кошерно" будет выглядеть.

3. > Обход export -f я решал вызовом скриптом самого себя ($0) с дополнительным параметром

Я только начал разбираться с bash-script (это не мое, мое это СИ).

Может поправите, скрипт - вот он.

Как минимум покажите строку/строки вызова самого себя ($0)

Если удастся исключить вызов ф-ций, то будет работать и со старым gtkdialog

Offline

#34 2012-11-06 10:16:55

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: screenshot снимок экрана

Ох, я вчера всю голову себе сломал, но так и не смог сделать вариант дизайна, который бы устраивал меня.

Учебный скрипт здесь: http://snipurl.com/25inff9 (лучше открыть в новой вкладке).

Назначаем пару функций для наглядности.

Формируем тело диалога. Обрати внимание на "кавычки" (не 'такие') — при этом наш скрипт заменит $0 на обращение к себе (путь/имя) где бы он ни лежал и откуда бы он ни запускался (в моём случае сейчас это /home/tux/scripts/scrot/self.sh)

Подробнее.

Первая кнопка, ее action:

/home/tux/scripts/scrot/self.sh func x

Скрипт примет переменные: $1="func" и $2="x"

Оператор case в конце скрипта при $1="func" передаёт управление функции chooser и передаёт ей параметр $2="x".

Теперь мы в функции chooser. Она принимает параметр $1="x". Если "x" то запускается xterm.

Вторая кнопка — аналогично.

Третья кнопка. Ее action:

/home/tux/scripts/scrot/self.sh draw \$DELAY

Почему перед переменной стоит экранирующий слэш? Потому что при описании диалога мы используем "такие" кавычки. Если слэша не будет, то при формировании диалога $DELAY будет заменено на значение переменной $DELAY, а внутри скрипта она не определена и грубо говоря мы получим пустоту ("").

Здесь мы опять, как и в 1-й и 2-й кнопках запускаем себя же. Теперь параметры $1="draw" и $2=$DELAY (диалог подставит здесь текущее значение переменной DELAY).

Оператор case в конце скрипта видит, что $1="draw" и запускает функцию mtp с параметром, $1 равным значению переменной DELAY.

Теперь мы внутри функции mtp. У нее параметр $1 — это значение задержки. Просто выводим сообщение, которое включает в себя эту переменную (сообщение пойдёт на STDOUT и будет видно, например, если весь этот учебный скрипт запускать из терминала); после этого "спим" нужное число секунд и запускаем MTPaint.

Осталась еще одна опция в операторе case в конце скрипта.

Если скрипт запускается с параметрами, отличными от "func" и "draw", либо запускается вообще без параметров, то просто показываем диалог.

Надеюсь, понятно объяснил. Знаю, надо учить других, но не всегда есть время и желание.

Offline

#35 2012-11-06 16:21:36

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

> не смог сделать вариант дизайна

Не это самое главное.

> Назначаем пару функций для наглядности

Цитирую самого себя:

gtkdialog version 0.7.20 - версия по умолчанию не знает вызова функций

На всякий случай уточняю:

Пока в slitaz не будет gtkdialog версии 0.8 или выше, ни о каком вызове функций в скрипте нет и речи.

Тот скрипт, что я сваял штатно работает с gtkdialog версии 0.8

Для меня это было только упражнение - понять основы script-описания.

Нужно решение без вызова функций

Offline

#36 2012-11-06 16:40:01

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: screenshot снимок экрана

sklimkin,

Я это значит зря распинался ;(

Ты бы попробовал для начала.

Заметь, в action я не вызываю какую-то левую функцию, я вызываю бинарник/скрипт/команду (называй как хочешь).

Если у тебя будет написано

[c]<action>xterm</action>[/c]
Это же будет работать! И при нажатии на кнопку будет запускаться xterm. Попробуй.

[c]$ gtkdialog -v
gtkdialog version 0.7.20 (C) 2004, 2005, 2006, 2007 by Laszlo Pere[/c]

Offline

#37 2012-11-06 21:39:11

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

Алексей, не надо обижаться.

Я посмотрел ссылку http://snipurl.com/25inff9

В этом скрипте в самом начале 2 ф-ции: chooser() {......} и mtp() {......}

Их я и назвал вызовы функций в скрипте

Тот gtkdialog что по умолчанию есть в slitaz-4.0 не обрабатывает такие вещи при вызове из из тела своей главной ф-ции:

export MAIN_DIALOG='

... ... ...

'

(проверьте)

Почитал еще немного о скриптах в bash sh и вот какой вариант (без вызова функций) получился:

#!/bin/sh

GTKDIALOG=gtkdialog

export MAIN_DIALOG='

<window title="SCReenshOT  screen-grabber">

    <vbox>

        <frame Command button EXIT>

            <hbox>

                <button cancel></button>

            </hbox>

        </frame>

        <frame User-settings>

            <hbox>

                <vbox>

                    <text>

                        <label>Select grab-mode</label>

                    </text>

                    <combobox>

                        <variable>COMBOBOX1</variable>

                        <item>-m All</item>

                        <item>-u Window</item>

                        <item>-s Area</item>

                        <action>save:COMBOBOX1</action>

                    </combobox>

                </vbox>

                <vbox>

                    <text>

                        <label>Time-delay-sec</label>

                    </text>

                    <combobox>

                        <variable>COMBOBOX2</variable>

                        <item>0</item>

                        <item>1</item>

                        <item>2</item>

                        <item>3</item>

                        <item>5</item>

                        <item>10</item>

                        <item>20</item>

                        <action>save:COMBOBOX2</action>

                    </combobox>

                </vbox>

                <button>

                    <label>ACCEPT</label>

                    <action>scrot "${COMBOBOX1:0:2}-b-d ${COMBOBOX2}-e"</action>

                </button>

            </hbox>

        </frame>

        <frame Select DIR for save screenshots>

            <chooser>

                <height>200</height>

                <width>200</width>

                <variable>FILE</variable>

                <default>/home/</default>

                <action>cat [ echo $FILE ] | zenity --text-info  --width=250 --height=250 --title $FILE</action>

            </chooser>

        </frame>

    </vbox>

</window>

'

case $1 in

    -d | --dump) echo "$MAIN_DIALOG" ;;

    *) $GTKDIALOG --program=MAIN_DIALOG ;;

esac

Командная строка для вызова scrot теперь получается/собирается:

<action>scrot "${COMBOBOX1:0:2}-b-d ${COMBOBOX2}-e"</action>

Проверил работу скрипта в slitaz под его интерпретатором sh

1. захват всего экрана есть,

2. захвата только одного окна НЕТ (а в Юбунте есть),

3. захват выделенной области рамкой есть.

Почему одно окно не захватывает - непонятно, буду разбираться, чтобы довести до конца.

Поэтому скриншотов только два:

[attachment=18332,783] [attachment=18332,784]

Offline

#38 2012-11-06 23:41:28

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: screenshot снимок экрана

Тот gtkdialog что по умолчанию есть в slitaz-4.0 не обрабатывает такие вещи при вызове из из тела своей главной ф-ции:

(проверьте)

Еще раз повторюсь, что я использую gtkdialog-0.7.20. При нажатии на кнопки у меня запускаются: xterm, tazweb, mtpaint. Что я делаю не так?

Я показал в учебном скрипте и расписал всю писанину как не вызывая функций добиться такого же эффекта как при вызове функций.

Изменения минимальны:

было, скажем

[c]<button>
    <label>function: terminal</label>
    <action>func x</action>
</button>[/c]
и конечно же, не работало. А стало

[c]<button>
    <label>function: terminal</label>
    <action>$0 func x</action>
</button>[/c]
и всё пучком! Обрабатывает же всю эту красоту дополнительный case в конце скрипта.

Я не обижаюсь. Но так дело не пойдёт. Во-первых, скажи, ты используешь gtkdialog-0.7.20 как и я? И ещё вопрос, установлен ли у тебя пакет bash? (У меня нет, если в начале скрипта написать #!/bin/bash то он не запустится). Есть некоторая разница в работе программ, когда bash установлен. Например, только bash позволяет

[c]export f имяфункции[/c]
Если bash не установлен, то эта команда не сможет экспортировать функцию в глобальные переменные.

Если bash не установлен, то команда export просто не имеет ключа "f".

Ну и еще вопрос, всё-таки пробовал запустить мой учебный скрипт? Или так, теоретически только? ☺

2. захвата только одного окна НЕТ (а в Юбунте есть),

Тот scrot, что у нас в репозитории не имеет такой опции (проверь: scrot --help). У нас последняя официальная версия. После этого автор перестал работать над своей программой. Но в убунте версия всё же новее, потому что разработку подхватили другие и выпустили с десяток патчей. Новую версию scrot с этими патчами я собирал, но почему-то никак не могу найти.

+++++

Проклятый склероз! ;/

Всё, выложил рецепт пропатченного scrot в wok и wok-stable.

Ждите на днях на экранах ваших мониторов, в стабильной и нестабильной версиях!

Offline

#39 2012-11-07 23:00:43

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

> Еще раз повторюсь, что я использую gtkdialog-0.7.20. При нажатии на кнопки у меня запускаются: xterm, tazweb, mtpaint

У меня не совсем так. См. скриншот.

> Во-первых, скажи, ты используешь gtkdialog-0.7.20 как и я?

root@slitaz:~# gtkdialog -v

gtkdialog version 0.7.20 (C) 2004, 2005, 2006, 2007 by Laszlo Pere

> И ещё вопрос, установлен ли у тебя пакет bash?

Установлен. Но для чистоты эксперимента скрипты сделанные в/для slitaz имеют первой строкой:

#!/bin/sh со всеми вытекающими ...

> Ну и еще вопрос, всё-таки пробовал запустить мой учебный скрипт?

А як же! Скриншот прилагаю, (то есть не все и не всегда однозначно, но будем думать).

> Тот scrot, что у нас в репозитории не имеет такой опции (проверь: scrot --help).

root@slitaz:~# scrot -v

scrot version 0.8

root@slitaz:~# scrot --help

... ... ...

-m, --multidisp           For multiple heads, grab shot from each

-s, --select              interactively choose a window or rectnagle

И пра-а-а-а-а-вда: -u нет такого ключа, спасибо, не буду напрасно напрягаться.

Я уже только из упрямства продолжил тискать свой скрипт для полного избавления от вызова "вспомогательных" функций. В Юбунте получил положительный результат. (Это больше изучение скрипт-писания), перенесу в slitaz на sh и покажу.

Ваш пример http://snipurl.com/25inff9 буду осмысливать и попытаюсь приладить.

О результатах расскажу попозже.

[attachment=18386,785]

Offline

#40 2012-11-07 23:24:37

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: screenshot снимок экрана

Здравствуй, полуночник wink

У меня не совсем так. См. скриншот.

Вижу только, что оконный менеджер почему-то решил, что окно gtkdialog зависло. Может быть, ты решил закрыть его вручную?

Но для чистоты эксперимента скрипты сделанные в/для slitaz имеют первой строкой:

#!/bin/sh со всеми вытекающими ...

Ну, не знаю. Подозрение всё-равно какое-то есть. Неплохо еще иметь чистую систему для таких экспериментов. У меня есть такая.

И пра-а-а-а-а-вда: -u нет такого ключа, спасибо, не буду напрасно напрягаться.

Обнови scrot. На зеркале уже доступна версия 0.8-12, о которой я говорил в конце своего прошлого поста. И будет тебе счастье wink

Ваш пример http://snipurl.com/25inff9  буду осмысливать и попытаюсь приладить.

О результатах расскажу попозже.

Не знаю, где тут собака порылась, я бы даже скринкаст снял, чтобы показать, что всё работает как часы.

Отлаживать скрипты в убунте и потом переносить в SliTaz - неблагородное занятие. Когда-то я сидел в Linux Mint, писал скрипты, потом мучительно пытался запустить их в SliTaz. Отличия есть. Ни о какой совместимости нельзя говорить.

В Mint (может и в Ubuntu?) в качестве /bin/sh используется dash.

В SliTaz /bin/sh - это ash (даже документации под него нету, воджежблин).

/bin/bash судя по всему тоже не торт и отличается от версии к версии. Плюс эти знаменитые башизмы (часть из которых всё же есть в нашем ash).

В общем, если не затруднит, создай себе чистую фругал-систему, попробуй там свой скрипт. Максимум что можно сделать - это обновить доступные пакеты и пересохранить rootfs.gz. Вся прелесть в том, что можно как угодно надругаться над системой, но после перезагрузки она будет такой же чистой.

Offline

#41 2012-11-08 10:34:11

devl547
Administrator
Registered: 2011-06-01
Posts: 285

Re: screenshot снимок экрана

>то ash (даже документации под него нету, воджежблин).

http://linux.die.net/man/1/ash не оно?

Я не раз замечал, что скрипты надо писать под busybox, потому как оно труЪ POSIX и содержит минимум дополнительных фич. При этом скрипты на нем и его утилитах потом откроются на любой системе.

Offline

#42 2012-11-08 11:34:24

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

> Обнови scrot. На зеркале уже доступна версия 0.8-12

Конечно сделаю, но надо завершить историю с gtkdialog version 0.7.20 (см. в конце поста).

> Отлаживать скрипты в убунте и потом переносить в SliTaz - неблагородное занятие.

"Не все так просто, пан капитан" - как сказал герой одного фильма про Великую отечественную войну.

Меня интересует максимально возможная переносимость в другие системы, иначе и не стал бы городить этот огород: ведь у меня есть СИ и GTK+.

> В общем, если не затруднит, создай себе чистую фругал-систему, ... ... ...

Эти вещи мне еще надо осмыслить (старенький я и не бысто соображаю, ха-ха-ха!)

> Я не раз замечал, что скрипты надо писать под busybox,

devl547 дайте небольшой, но внятный пример (я в Линуксе совсем недавно).

А пока вот такой результат (спасибо Алексею за его интересный пример - разобрался немного):

#!/bin/sh

funccommand () {

if [ "$COMBOBOX1" == "All" ]; then

COMMAND1="-m"

else COMMAND1="-s"

fi

## !!! Attention: This works in scrot ver. >= 0.8 only !!!

if [ "$COMBOBOX1" == "Window" ]; then

COMMAND1="-u"

fi

COMMAND2="$COMBOBOX2"

COMMANDSTRING="$COMMAND1 -b -d $COMMAND2 -e 'mv $f ~'"

echo "COMMANDSTRING= $COMMANDSTRING"

scrot "$COMMANDSTRING"

}

export MAIN_DIALOG="

<window>

    <vbox>

        <text>

            <label>SCReenshOT  screen-grabber</label>

        </text>

        <frame Command button EXIT>

            <hbox>

                <button cancel></button>

            </hbox>

        </frame>

        <frame User-settings>

            <hbox>

                <vbox>

                    <text>

                        <label>Select grab-mode</label>

                    </text>

                    <combobox>

                        <variable>COMBOBOX1</variable>

                        <item>All</item>

                        <item>Window</item>

                        <item>Area</item>

                        <action>save:COMBOBOX1</action>

                    </combobox>

                </vbox>

                <vbox>

                    <text>

                        <label>Time-delay-sec</label>

                    </text>

                    <combobox>

                        <variable>COMBOBOX2</variable>

                        <item>0</item>

                        <item>1</item>

                        <item>2</item>

                        <item>3</item>

                        <item>5</item>

                        <item>10</item>

                        <item>20</item>

                        <action>save:COMBOBOX2</action>

                    </combobox>

                </vbox>

                <button>

                    <label>ACCEPT</label>

                    <action>$0 func</action>

                </button>

            </hbox>

        </frame>

        <frame Select DIR for save screenshot>

            <chooser>

                <height>200</height>

                <width>200</width>

                <variable>FILE</variable>

                <default>/home/</default>

                <action>cat [ echo $FILE ] | zenity --text-info  --width=250 --height=250 --title $FILE</action>

            </chooser>

        </frame>

    </vbox>

</window>"

case $1 in

    func) funccommand $2 ;;

    *) gtkdialog --program=MAIN_DIALOG ;;

esac

Пришлось вставить строку:

## !!! Attention: This works in scrot ver. >= 0.8 only !!!

Скриншоты:

[attachment=18410,787] [attachment=18410,788]

Offline

#43 2012-11-08 12:49:46

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: screenshot снимок экрана

[c]‹offtopic start›[/c]

devl547,

http://linux.die.net/man/1/ash не оно?

Оно. Спасибо большое за такой жирный кусок инфы! Что-то я даже подумать не мог, что бывает man ash, даже не искал такое сочетание.

Кстати, а кто подскажет, что нам мешает использовать оригинальный man? Тот, для которого и писались все man-pages, а не те «костылики», которые здесь, да и Puppy Linux тоже, городятся. Конечно же, как опциональный пакет. Не все же «всезнамусы» ☺ Наверное, формат man полностью изжил себя; его пытался заменить info, но ведь не прижился? В результате, у меня есть некоторое количество русских man-pages, которые я и посмотреть толком не могу. Хотел переделать в html (man2html), но наверное, руки не оттуда растут. А так, linux.die.net тоже иногда пользуюсь.

busybox, потому как оно труЪ POSIX

Возможно. А может и нет.

При написании своих скриптов под Busybox недостатка в опциях не ощущается; при танцах с чужими — кажется, что гораздо проще поставить пакетик с нужной GNU Utility.

Нужно на что-то ориентироваться, во что-то верить. Ну например, верить, что у всех есть Busybox и что у всех будет работать одинаково. Для однозначного использования апплетов Busybox можно даже использовать конструкцию вида [c]/bin/busybox ntp[/c].

Но я заметил, например, экспериментируя с нашим «костыльным» man, что busybox less не поддерживает UTF-8 (и консольный браузер Ratawq, применяемый там — тоже). Чего ждать? Когда в Busybox допилят less или пока заменить его на GNUтый оригинал?

[c]‹offtopic end›[/c]

sklimkin,

[c]<action>$0 func</action>
… … …
case $1 in
func) funccommand $2 ;;[/c]
Параметра не хватает. Должно быть что-то вроде

[c]$0 func параметр[/c]

тогда будет

$1="func"

$2=параметр

и будет вызван

funccommand параметр

.

[c]funccommand () {
if [ "$COMBOBOX1" == "All" ]; then
COMMAND1="-m"
else COMMAND1="-s"
fi
… … …[/c]
Откуда в функции funcommand возьмётся значение переменной COMBOBOX?

Передавай всё необходимое в функцию как параметры:

вызов funccommand параметр1 параметр2 …

А изнутри функции будет видно: $1=параметр1 $2=параметр2…

Представь (так оно и есть), что эта фунция совершенно оторвана от всего прочего. Можешь представить для драматизма, что эта функция даже лежит в другом файле. Это просто мы для компактности не стали размещать функции в отдельном файле, но они не связаны переменными.

Это называется «областью видимости переменных». Внутри функции создаются свои переменные (и «убиваются» по выходу из функции) плюс изнутри функции видна текущая копия глобальных переменных той среды, из которой была вызвана.

Пример-объяснение.

Посмотреть текущие переменные окружения — команда set.

Запускаем два терминала. В первом пишем

LANG=en_US

Проверяем: locale

Да, видно, что LANG=en_US

Во втором терминале пишем locale и видим, что значение этой глобальной переменной окружения не изменилось. Также, для перепроверки командуем set на обоих терминалах.

Offline

#44 2012-11-08 14:31:05

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

> Откуда в функции funcommand возьмётся значение переменной COMBOBOX?

Специально сейчас добавил 2 строки в ф-цию funccommand ()

echo "COMBOBOX1= $COMBOBOX1"

echo "COMBOBOX2= $COMBOBOX2"

    и запустил скрипт снова.

Я не могу скопировать строки из терминала geany, но посмотрите их на скриншоте.

Действующие значения переменных COMBOBOX1 и COMBOBOX2 таки передаются.

Поэтому я и не стал над этим задумываться.

> Представь (так оно и есть), что эта фунция совершенно оторвана от всего прочего.

> ... , но они не связаны переменными.

Получается, что все-таки передача значений переменных есть.

Иначе не сработал бы выбор Area (в COMBOBOX1) и выбор (задержка в 5 сек) (в COMBOBOX2).

Еще раз: посмотрите скриншот, а лучше запустите на исполнение мой скрипт.

Выбор Area работает и я выделил рамкой то, что хотел показать. Задержка в 5 сек. - тоже.

Строка COMMANDSTRING= -s -b -d 5 -e 'mv ~' тоже не с неба упала.

Тогда перейдем к оставшейся проблеме: почему снимок не переносится ($FILE) в выбранную DIR.

[attachment=18423,789]

Offline

#45 2012-11-08 14:53:39

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: screenshot снимок экрана

Правильно, «доверяй, но проверяй»!

Значит, gtkdialog перед вызовом внешней команды экспортирует свои/свою переменные в переменные окружения. Я думаю, что иначе они не были бы видны из функции. Для этого можно вместо дополнительных echo дать одну команду set (и/или env?) и в тот терминал, откуда запускался диалог вывалит «портянку» всех переменных окружения для текущего контекста.

Сейчас разбираться со скриптом времени нету, позже посмотрю обязательно. Так, делаю перекуры между ремонтными работами ☺

Почему переменная FILE не попадает в переменные окружения? Возможно, за это отвечает действие

[c]<action>save:ПЕРЕМЕННАЯ</action>[/c]
Попробуй прописать в нужное место для FILE.

Offline

#46 2012-11-08 15:51:16

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

> Почему переменная FILE не попадает в переменные окружения?

Переменная FILE как и другие видна в ф-ции funccommand ()

Не происходит перемещение mv '...' снимка из текущей DIR в указанную пользователем через FILE

Вот где засада!

У нас диалог (это конечно лучше, чем монолог).

Жаль, что больше никто не высказывается.

Ведь этот этюд будет полезен в разных иных ситуациях.

Дело, по большому счету, вовсе не в scrot и даже не в gtkdialog.

Offline

#47 2012-11-08 16:17:28

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: screenshot снимок экрана

Во-первых, я давно уже сомневаюсь в необходимости такого вот финта:

[c]<chooser>
<height>200</height>
<width>200</width>
<variable>FILE</variable>
<default>/home/</default>
<action>cat [ echo $FILE ] | zenity --text-info --width=250 --height=250 --title $FILE</action>
</chooser>[/c]
Не стоит ли его сократить до:

[c]<chooser>
<variable>FILE</variable>
<default>/home/</default>
<action>save:FILE</action>
</chooser>[/c]
Не помню, пишу по памяти. Да и zenity у меня по умолчанию не стояло (а ты говорил…)

Второе. Посмотри скправку scrot --help. Что нужно указать, чтобы переместить скриншот?

[c]COMMANDSTRING="$COMMAND1 -b -d $COMMAND2 -e 'mv $f ~'"[/c]
В таком виде перемещает его в ~

А может стоит попробовать

[c]COMMANDSTRING="$COMMAND1 -b -d $COMMAND2 -e 'mv $f $FILE'"[/c]
Не совсем уверен, что подставится значение $FILE в одинарных кавычках. Тогда, может, так:

[c]COMMANDSTRING="$COMMAND1 -b -d $COMMAND2 -e 'mv $f "$FILE"'"
объяснение:   "------------------------------------"     "-"[/c]

Offline

#48 2012-11-08 20:42:51

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

> Не стоит ли его сократить до:

Сократил, но легче не стало. Высота chooser'а получается слишком маленькой.

Вернул обратно

<height>200</height>

<width>200</width>

> -e 'mv $f ~'

Как выяснилось, mv не получает от  scrot переменную $f в строке, где имя файлу (по умолчанию) задает сам scrot.

Offline

#49 2012-11-08 22:52:09

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: screenshot снимок экрана

Используемая команда -e 'mv $f ~' что делает? Перемещает готовый отснятый скриншот в домашнюю папку (~ обозначает домашнюю папку). Такое поведение предпологалось? Я думал, что хотелось перемещать скриншоты не только в домашнюю папку, но и в любую другую папку. Я предлагал переместить туда, как указано в переменной FILE, т.е.:

не

-e 'mv $f ~'

а

-e 'mv $f $FILE'

Но в силу того, что это шелл-скрипт, нужно отдельно подумать о кавычках, чтобы на место $f не подставлялось ничего и чтобы $f пошло в scrot как литерал, а вот вместо $FILE нужно, чтобы подставилось значение переменной FILE. Об этом я и писал в прошлом посте. Вижу, успехи не очень.

+++++

перед $ нужно поставить \ для того, чтобы $f не заменялось на значение переменной $f:

[c]-e 'mv \$f $FILE'[/c]
Ужé лучше, но всё равно у меня не перемещает в нужную папку (наконец-то посмотрел твой последний скрипт).

Offline

#50 2012-11-09 12:05:31

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: screenshot снимок экрана

> Ужé лучше, но всё равно у меня не перемещает в нужную папку (наконец-то посмотрел твой последний скрипт).

Попробую резюмировать, бо тема и моя голова уже распухли от этой локальной, хоть и интересной задачи.

-----------------------------------------------------------------------------------------------------

Программа scrot создает файл - снимок экрана в том каталоге, откуда она вызывается.

Включение в код скрипта chooser'а было бы бессмысленным, если бы созданный программой scrot файл не перемещался туда, куда указал пользователь.

Help смотри в конце поста, или еще проще: scrot --help

Но команда перемещения, указанная в help'е scrot вида:

scrot operation.png -e 'mv $f /home/kurt/Desktop/'

работает только из командной строки терминала и не работает из скрипта, если имя файла задает сам scrot.

Поясняю:

1. если задавать имя файла явно, то премещение происходит,

2. если создание имени файла доверить scrot'у, то премещение не происходит,

3. создание имени файла scrot'ом предпочтительно потому, что он включает в него дату и время до секунд - это не создает конфликта имен файлов, если делается более одного снимка за сеанс.

Поэтому процесс создания и перемещения скриншота/скриншотов решается в 2 приема:

scrot "$COMMANDSTRING"

- в этой строке параметры захвата экрана и время задержки снимка

mv [c]echo *_scrot.png[/c] "$FILE"

- а в этой строке получение имени файла, созданного scrot'ом и адрес, куда переместить этот файл.

Команда нахождения имени файла обязательно берется в обратные (или косые) кавычки - тогда то, что в них интерпретируется именно как КОМАНДА.

Каталог назначения $FILE берется в двойные кавычки на тот случай, если в нем окажется нечто типа <Рабочий стол>, то есть в имени есть пробелы.

Иначе до команды mv дойдет только <стол> и она не сработает.

Таким образом команда mv получает правильное имя файла и правильный каталог назначения.

Нет в компьютерном мире совершенства: если в каталоге со скриптом будут файлы, с окончанием на _scrot.png то перемещения снимка не получится и снимок осядет в этом ТЕКУЩЕМ каталоге.

Значит надо "следить за чистотой рядов".

На этом считаю (для себя) вопрос закрытым.

Если кто-то знает более изящное решение вопроса, с удовольствием поучусь.

Ссылки по теме:

http://ru.wikibooks.org/wiki/UNIX

http://en.wikipedia.org/wiki/Scrot

http://linuxandfriends.com/2008/10/25/take-screenshots-in-linux-with-scrot/

http://www.itnewb.com/tutorial/Using-Scrot-the-Screen-Shot-Command-Line-Utility-for-Linux

После "непродолжительного" обсуждения вопроса с Алексеем, мой скрипт принял вид:

#!/bin/sh

funccommand () {

if [ "$COMBOBOX1" == "All" ]; then

COMMAND1="-m"

else COMMAND1="-s"

fi

## !!! Attention: This works in scrot ver. >= 0.8 only !!!

if [ "$COMBOBOX1" == "Window" ]; then

COMMAND1="-u"

fi

COMMAND2="$COMBOBOX2"

COMMANDSTRING="$COMMAND1-b-d $COMMAND2"

##echo "COMMANDSTRING= $COMMANDSTRING"

##echo "COMBOBOX1= $COMBOBOX1"

##echo "COMBOBOX2= $COMBOBOX2"

##echo "FILE= $FILE"

scrot "$COMMANDSTRING"

mv [c]echo *_scrot.png[/c] "$FILE"

}

export MAIN_DIALOG="

<window>

    <vbox>

        <text>

            <label>SCReenshOT  screen-grabber</label>

        </text>

        <frame Command button EXIT>

            <hbox>

                <button cancel></button>

            </hbox>

        </frame>

        <frame User-settings>

            <hbox>

                <vbox>

                    <text>

                        <label>Select grab-mode</label>

                    </text>

                    <combobox>

                        <variable>COMBOBOX1</variable>

                        <item>All</item>

                        <item>Window</item>

                        <item>Area</item>

                        <action>save:COMBOBOX1</action>

                    </combobox>

                </vbox>

                <vbox>

                    <text>

                        <label>Time-delay-sec</label>

                    </text>

                    <combobox>

                        <variable>COMBOBOX2</variable>

                        <item>0</item>

                        <item>1</item>

                        <item>2</item>

                        <item>3</item>

                        <item>5</item>

                        <item>10</item>

                        <item>20</item>

                        <action>save:COMBOBOX2</action>

                    </combobox>

                </vbox>

                <button>

                    <label>ACCEPT</label>

                    <action>$0 func</action>

                </button>

            </hbox>

        </frame>

        <frame Select DIR for save screenshot>

            <chooser>

                <height>200</height>

                <width>200</width>

                <variable>FILE</variable>

                <default>/home/</default>

                <action>save:FILE</action>

                <action>$2= $FILE</action>

            </chooser>

        </frame>

    </vbox>

</window>

"

case $1 in

    func) funccommand $2 ;;

    *) gtkdialog --program=MAIN_DIALOG ;;

esac

P.S. Закомментированные строки вида: ##echo "... ..."

были нужны только для отладки, их можно смело удалить.

В строке mv echo *_scrot.png "$FILE" движок форума удаляет одинарные обратные (или косые) кавычки.

Это буква Ё - но в латинской раскладке

обратите на это внимание и исправьте если будете копировать текст скрипта,

то есть: ОБРАТНАЯ_КАВЫЧКАecho *_scrot.pngОБРАТНАЯ_КАВЫЧКА

В свете изложенного подправлю свой gcc-GTK+ бинарник и ВСЁ !!!

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.018 seconds, 7 queries executed - Memory usage: 1.69 MiB (Peak: 1.77 MiB) ]