neděle 11. prosince 2011

Spouštěcí skript a opět Launcher

Další poznámky z mého bastlení. Občas je před spuštěním aplikace potřeba z shellu nastavit nějaké ty proměnné prostředí. Pokud nemáte pevně dané umístění aplikace, ale znáte pouze její relativní umístění vzhledem ke spouštěcímu sktiptu, může si skript tuto cestu jednoduše odvodit. Je-li ve stejném adresáři, jako aplikace, kterou spouští, může spouštěč vypadat třeba takto:

#!/bin/sh
export UBUNTU_MENUPROXY=
cd "` dirname "$0"`"
./aplikace "$@" &

Proměnná $0, obsahuje řetězec, kterým byl skript volán, může to být například ./Desktop/adresář/aplikace. Příkaz dirname z cesty odstraní vlastní jméno skriptu, a ponechá cestu. Ať už je cesta relativní, vztahující se k aktuálnímu pracovnímu adresáři, nebo absolutní, příkazem cd "` dirname "$0"`", změníte pracovní adresář na ten, ve kterém se nachází skript, ze kterého příkaz voláte. Absolutní cestu pak můžete získat příkazem pwd.

Následující text doplňuje můj předchozí příspěvek Quicklisty - problém se zdvojováním ikon a souvisí právě s tématem spouštěcího skriptu.
Nazvu například pythonní skript aplikace a spouštěcí skript aplikace-spouštěč. Desktopový spouštěč, umístěný v Unity Launcheru, tedy odkazuje na spuštěcí skript, který dále spustí aplikaci a sám chcípne, protože jsem aplikaci nechal spustit na pozadí příkazem &. Stane se to, že si Launcher nedokáže spojit hlavní okno aplikace se skriptem, který spustil a vytvoří pro okno novou ikonu. Tak si říkám "třeba to jen nestihne.." a přidám na konec skriptu sleep 5. Hle, není úplně hloupý, zabralo to. No jo, ale jen pokud spustím aplikaci poklepáním přímo na ikonu. Při spuštění z menu quicklistu, se ikona opět vesele zdvojuje, stejně jako jsem popsal ve výše zmíněném příspěvku. Dále tedy zařazuji základní myšlénku, že když se budou spouštěč i aplikace jmenovat stejně, bude se i proces jmenovat stejně a to by mohlo něco řešit. Samozřejmě je nemůžu mít v jednom adresáři, tak vytvořím podadresář launcher, spouštěcí skript nacpu tam a doplním příkaz pro přesun do nadřazeného adresáře:

#!/bin/sh
export UBUNTU_MENUPROXY=
cd "` dirname "$0"`"
cd ..
./aplikace "$@" &

A sláva, funguje jak má, i bez sleepu. Cairo Dock ikony také nezdvojuje, ale zase registruje pouze první instanci a další vesele ignoruje. Je to zkrátka legrace :)

Zkoušel jsem předtím operovat i s parametrem StartupWMClass, kterým můžete v desktopovém spouštěči určit třídu okna, která k němu patří, ale to v mém případě řešení nepřineslo.

Žádné komentáře:

Okomentovat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.