Пользуюсь своими скриптами для повседневных нужд и некоторые удобно запускать в заданном размере окна, для этого приходится пользоваться таким вот корявым решением: писать второй скрипт-лаунчер, который откроет терминал, задаст размер окна и укажет какой скрипт в нём выполнить в итоге на один скрипт уходит 2 файла. Муторно и некрасиво. Можно как-то это всё в одном скрипте писать, чтобы он и терминал открывал и скрипт в себе содержал. Но важно чтобы читабельность скрипта не страдала и не приходилось всё это в одну строчку писать, или там все кавычки экранировать.Пользуюсь терминалом xfce4-terminal. Если потребуется перейти на другой - перейду.
> Можно как-то это всё в одном скрипте писать, чтобы он и терминал открывал и скрипт в себе содержал.
echo -e "\033]2;Уникальное имя\007" # меняем заголовок окна
wmctrl -r "Уникальное имя" -e 0,xpos,ypos,width,height # меняем размер/позицию
# (-1 == оставить "как есть", т.е. -e 0,-1,-1,50,-1 изменит только ширину)
# или
xdotool search --name "имя" windowsize %@ 100 100
Размер окна rxvt-unicode можно поменять так:
printf '\033[8;25;80t'
, где 25 — кол-во строк, 80 — кол-во столбцов.Там ещё много всего полезного, man 7 urxvt.
> Размер окна rxvt-unicode можно поменять так:
> printf '\033[8;25;80t'
> , где 25 — кол-во строк, 80 — кол-во столбцов.Можно, но не везде (st, konsole - не хотят ;)).
А вообще, после повторного прочтения, сдается мне, что ТСу нужно решение (типа "sentinel") для запуска самого скрипта в отдельном/новом окне терминала, а не изменение размеров текущего окна.
> А вообще, после повторного прочтения, сдается мне, что ТСу нужно решение (типа
> "sentinel") для запуска самого скрипта в отдельном/новом окне терминала, а не
> изменение размеров текущего окна.Нет нет, зменение текущего окна вполне годится.
> Размер окна rxvt-unicode можно поменять так:
> printf '\033[8;25;80t'
> , где 25 — кол-во строк, 80 — кол-во столбцов.
> Там ещё много всего полезного, man 7 urxvt.нет мана по urxvt
Но вообще это вроде то что надо, спасибо.
А как ещё позицию задать таким методом? ато чёт гуглится всё нето. Что это вообще за технология, по каким ключевым словам по ней хелп в нете искать?
> нет мана по urxvtТак его надо установить, не пробовали?
> А как ещё позицию задать таким методом?
В том же разделе мана:
Ps = 3 ESC [ 3 ; X ; Y t Move window to (X|Y)
Ps = 4 ESC [ 4 ; H ; W t Resize to WxH pixels> Что это вообще за технология, по каким ключевым словам по ней
> хелп в нете искать?Escape sequences, у каждого терминала они могут быть свои.
> В том же разделе мана:
> Ps
> = 3 ESC [ 3 ;
> X ; Y t Move window to (X|Y)
> Ps
> = 4 ESC [ 4 ;
> H ; W t Resize to WxH pixelsпоробовал вот так:
echo -e "\033[3;0;0t"
- не работает
> echo -e "\033]2;Уникальное имя\007" # меняем заголовок окна
> wmctrl -r "Уникальное имя" -e 0,xpos,ypos,width,height # меняем размер/позицию
> # (-1 == оставить "как есть", т.е. -e 0,-1,-1,50,-1 изменит только
> ширину)Блин и всё бы классно, но вот проблема, для второго запущенного окна с таким же именем этот трюк уже не сработает. Придётся в каждом скрипте городить какой то механизм для генерации уникального элемента имени окна. Ещё есть один значительный минус - размеры окна приходится вводить в формате координат пикселей экрана, а не в размерах строк и столбцов терминала. Просто Эти размеры - фиг его знает откуда брать, а размер в строках и столбцах узнаётся на раз-два - ПКМ по заголовку окна, изменить размер - и вот они.
> # или
> xdotool search --name "имя" windowsize %@ 100 100а тут не пойму как имя текущего окна получить
> а тут не пойму как имя текущего окна получитьДелал бы в скрипте через process id:
shift
nohup xterm 2>/dev/null 1>/dev/null &
term_process_id="$!"
придумать-как-найти-окно-по-процессу "$term_process_id"По term_process_id найти процесс, выгуглить, как из процесса вынуть название окна. Подозреваю, утилиты из этого треда даже, может быть, умеют это.
Могут помочь какие-то трюки типа:
read proc_id cmd <<< $(ps aux | awk '{print $2 " " $11}' | egrep "^1[[:space:]]" )
echo $proc_id
echo "$cmd"Вместо xterm пишешь "${@}"
Прямо вот так с кавычками - "${@}" - это передаст все параметры твоего скрипта в nohup. Т.е. запуск типа, например:
мой-скрипт-обёртка xterm -e 'echo "Hello, World"'Делаешь desktop файлы типа /usr/share/applications/xterm-in-tray.desktop
Вот содержимое:
[Desktop Entry]
Name=XTerm in tray у часов
Exec=alltray --large_icons --sticky --icon "/usr/share/icons/document-save.svg" мой-скрипт-обёртка xterm -e 'echo "Hello, World"'
Icon=gtk-save
Terminal=false
X-MultipleArgs=false
Type=Application
StartupNotify=true
Categories=GNOME;GTK;System;
Comment=Терминал в трее у часов
'desktop' файлы появятся в меню запуска программ. Скорее всего этот будет в папке "Системные", т.к. "System;".Примерно так бы делал. Имена, тексты взяты из реальных конфигураций, это работает, может только здесь где-то опечатки. Очевидно, нужно всё подогнать друг к другу, склеить вместе. Примеры desktop в избытке в /usr/share/applications/
Получается один скрипт обёрка + по одному desktop файлу на каждое приложение. Дубликации кода нет, безумных километровых oneliner'ов тоже нет. Норм.
Можно паковать в deb пакет и побликовать на Гит-хабчике. ))))
> Получается один скрипт обёрка + по одному desktop файлу на каждое приложение.
> Дубликации кода нет, безумных километровых oneliner'ов тоже нет. Норм.Ооой нет. Я категорически решил отказаться от схем где на скрипт нужна обёртка или desktop-файл. Решил всё-таки юзать способ "подсаливанием" заголовка окна случайным числом:
#!/bin/bash
id=$RANDOM
title="СКРИПТ для великих дел ID: $id"
w=133
h=40
x=0
y=0
echo -e "\033]2;$title\007" # меняем заголовок окна
wmctrl -r "$title" -e 0,$x,$y,-1,-1 # задать позицию (через два последних аргумента можно задать размеры в пикселях, "-1" значит - не менять). Этот способ почему-то работает только 1 раз за запуск.
echo -e "\033[8;$h;$w;t" # задаём размер окна (в строках и столбцах)
#здесь делаем свои великие дела.Паковать в дебку и распространять правда я бы такое не стал, так как тут говорили, что это довольно не кросс-терминальное решение и например в Konsole скореее всего не взлетит. Но лично для меня сойдёт. Мне же никто не мешает поставить себе xfce4-terminal.
Ну а чтобы не городить desktop -файлы для запуска у меня сделана всего одна кнопка на панели, которая запускает всего один Gui-лаунчер направленный на каталог со скриптами, где остаётся только 2 раза кликнуть по нужному скрипту и готово.
Вот нехитрый код ланчера:
#!/bin/sh
filename=`zenity --filename=/путь_к_твоему_скриптохранилищу/ --file-selection --title="чего запустим?"`
case $? in
0) xfce4-terminal -e "$filename" ;;
esacТолько нужно пакет zenity сперва поставить.
Linux way, это такой путь, который у каждого свой собственный.> как тут говорили, что это довольно не кросс-терминальное решение
Так понимаю, предложенное мною не зависит от выбора конечной программы. Хоть к Libre Office можно применить. Один пробел: нет описания, как по pid найти нужный заголовок (когда-то городил удалённые столы и есть ощущение о воспоминаниях, что есть нужные утилиты: по pid получить исчерпывающую инфу о свойствах графического окна).
> решил отказаться от схем где на скрипт нужна обёртка
Смотря по какой причине. Обёртка оправдана, если
- это программный код (а это простенькая программка на языке Shell; в посте выше код для Баш из-за конструкции <<< ),
- этот код можно переиспользовать много раз (можно переиспользовать для любых программ).Обёртка - синоним слов функция, метод, процедура в языка программирования - код, который много раз переиспользуется в разных местах. Это стандарт, признанный фундамент.
Тем самым, обёртка - инженерно признанный способ: целая утилита запуска.
Desktop файлы - стандарт создания ланчеров. Независимо от типа DE (Kde, Lxde, Xfce), независимо от панели задач, дистрибутива Вы получаете пакет ланчеров на годы вперёд. В некоторых DE описанное desktop файлами можно вытаскивать мышкой на панель запуска.
Однотипные файлы можно генерировать скриптом сразу в /usr/share/applications или, была вроде, в домашнем каталоге аналогичная папка под desktop файлы (если не вру), например. А можно генерировать вообще в своих папках, а в /usr/... кидать симлинки на свои папки.
> для запуска у меня сделана
> всего одна кнопка на панели, которая запускает всего один Gui-лаунчер направленный
> на каталог со скриптами, где остаётся только 2 раза кликнуть по
> нужному скрипту и готово.Можно ещё меньше действий: подвёл мышку к краю монитора и один клик для запуска (вторая панель с кнопкой запуска обёртки).
Вы описали кнопку Старт в панели задач. :)
Графический ланчер (кнопка) с меню из нескольких пунктов (скриптов).
Разница в способе хранения конфигурации: свои файлы или общесистемные desktop.Вы так или иначе создаёте файлы. Если в Вашей системе программный код организован по best practice, конфигурации созданы в рамках соглашений использованного дистрибутива, то Ваш труд легче портировать, легче поддерживать. Вы интегрируетесь в сообщество, где взаимный труд и обмен наработками.
P.S. Desktop файлы доступны в поиске у xfce4-appfinder (XFCE кнопка Старт, но отлично работает в самостоятельном режиме как отдельное приложение).
>> а тут не пойму как имя текущего окна получить
> Делал бы в скрипте через process id:
>
> shift
> nohup xterm 2>/dev/null 1>/dev/null &
> term_process_id="$!"
> придумать-как-найти-окно-по-процессу "$term_process_id"
>
> По term_process_id найти процесс, выгуглить, как из процесса вынуть название окна. Подозреваю,
> утилиты из этого треда даже, может быть, умеют это.Мудрёно.
#!/bin/sh
if [ -z "$SENTINEL" ] ; then
export SENTINEL=1
xfce4-terminal --geometry 300x400 -x "$0" "$@"
exit 0
fiecho "сдесь мы делаем свои великие дела" $1 $2 $8