Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Téma založeno: JirkaZ 24 Října 2024, 20:20:58
-
Stručně popíšu situaci:
mám několik skriptů s prakticky stejným obsahem (liší se jen parametry). Slouží pro posílání řídících znaků (řetězců) přes sériový port. Příklad příkazu (normálně se spouští v konzoli), který by byl jako jeden skript (parametry, resp. zasílané znaky či řetězce jsou v uvozovkách):
stty -F /dev/ttyS5 19200 -parity cs8 -cstopb && echo -e -n "\x1b\x48\x30" > /dev/ttyS5
Rád bych k těmto (cca 5 až 10) skriptům udělal GUI, kde by se v okně myší "mačkala" tlačítka a po zmáčknutí by se na pozadí (tj. bez viditelně otevřeného okna s konzolí) příslušný skript spustil.
Při letmém zkoumání možností, jak to udělat, jsem narazil na Zenity, Kdialog apod., ale nikde jsem nenašel příklad odpovídající popisu výše.
Poradil by někdo? Nejlépe přímo příkladem (tj. kódem)...
Díky.
-
Pokud vím, tak v obou dvou uvedených aplikacích se dá udělat asi jen potvrzovačka. Kdialog bude ale nativ pro KDE.
Ale bylo něco takového, čím se skládali okna pro výkon skriptů. Bylo to použito třeba tuším pro grub-doctor ve starých Parted Magic a v SalineOS. Tenkrát jsem ho zkusil portovat a zjistil jsem to prostředí, které se však musí doinstalovat. Akorát se pak naučit syntaxi.
takže když půjdeš po stopách grub-doctor, tak najdeš, to co hledáš :)
Tak se to myslím jmenuje "Yad", ale jak na to koukám zběžně, tak by to možná šlo i v tom Zenity - myslím, že jsem to tenkrát takhle přepsal.
Tady je script, který napoví, jak se s tím pracuje:
https://github.com/xanadu-linux/xanadu-grubdoctor/blob/master/grub-doctor
Ale nevím, jestli se s tím dá udělat třeba víc tlačítek. Tak bych se spíš koukal na to jak skládat okna přímo - tzn, nějaký CSS nebo tak něco? ...
-
Já jsem zatím šel "po stopách" ChatGPT (zcela proti svému přesvědčení) a něco (i když nedokonale) už to dělá.
Nejhorší je tomu blbému stroji položit otázku tak, aby nenabízel úplné nesmysly...
-
Ak nepotrebuješ vidieť reakciu skriptu, tak by asi išlo urobiť spúšťače a poklepávať na ne myšou z plochy. Ja si takým spôsobom mením parametre power managamentu kedy potrebujem aby sa mi PC niekedy uspal za 10 minút nečinnosti, inokedy za 2 hodiny.
-
West: jo, to je jistě možné, podobně lze třeba spouštět ty "subskripty" třeba poklepáním na ně v Krusaderu.
Ale chtěl jsem mít vše pohromadě (tedy v tom jednom okně), taky to chápu jako něco nového, čemu se přiučím.
-
#! /usr/bin/env bash
odpoved=$(zenity --info --title 'Moje okno' \
--text 'Vyber si:' \
--extra-button PRVA \
--extra-button DRUHA \
--extra-button TRETI \
--extra-button CTVRTA \
--ok-label Storno\
)
navrat=$?
# Test návratové hodnoty
if [ $navrat -eq 0 ]; then
exit 0
fi
# Testy odpovědí
case $odpoved in
PRVA) echo "$odpoved jsi si vybral"
echo "Ty dva oddělovací středníky jsou důležité"
;;
DRUHA) echo "Fakt chceš dvojku?"
;;
TRETI) echo "$odpoved - tak ta se ti vymstí"
;;
CTVRTA) echo "$odpoved je ta správná volba. Už jsi profík :D"
;;
esac
Myslím, že je to dost názorně napsáno, takže vzhůru do úprav. Na ten script si udělej spouštěč na ploše a hotovo.
-
ramaeli díky, běhá to, ale:
1) postrádám tam část, která bude spouštět příslušné subskripty (resp. asi tam alespoň v základu je, ale nevidím ji) - čili poprosím o doplnění v tom smyslu (subskripty budiž třeba a.sh, b.sh a c.sh);
2) potřebuju, aby se okno po volbě libovolné z aktivních hodnot (tzn. některého z nabízených tlačítek => subskriptů kromě Storno) nezavřelo, ale bylo připravené na další volbu (jde to, ejaj vytvořený kód to umí).
Vážně nejsem programátor, takže mě ber s rezervou ;-) Zvládám s odřenýma ušima jednoduché věci v Basicu, nějaké úplné základy z Arduino IDE apod.
Edit: krůček už jsem udělal a snad to ty subskripty spouští:
#! /usr/bin/env bash
odpoved=$(zenity --info --title 'Moje okno' \
--text 'Vyber si:' \
--extra-button PRVA \
--extra-button DRUHA \
--extra-button TRETI \
--ok-label Storno\
)
navrat=$?
# Test návratové hodnoty
if [ $navrat -eq 0 ]; then
exit 0
fi
# Testy odpovědí
case $odpoved in
PRVA) ./a.sh
;;
DRUHA) ./b.sh
;;
TRETI) ./c.sh
;;
esac
-
Jeste zalozky by se mohly v tom okne hodit - to by se mozna vytahlo z toho grubdoctor.
Zenity je tusim i v xfce. Myslim, ze jsem tenkrat ten skript vzal a vsechno "yad" jsem prepsal na "zenity" a fachalo to. A tam i to retezeni na vykon prikazu.
Kdyz uz jsme u toho ve Win je Notepad++ a ten umi hromadny prepis, nahrazeni znaku atp. - je nejaka obdoba v Deb-linux? To by dost zjednodusilo takovy prepis skriptu pro jine prostredi ..
-
Jeste zalozky by se mohly v tom okne hodit - to by se mozna vytahlo z toho grubdoctor.
Zenity je tusim i v xfce. Myslim, ze jsem tenkrat ten skript vzal a vsechno "yad" jsem prepsal na "zenity" a fachalo to. A tam i to retezeni na vykon prikazu.
Kdyz uz jsme u toho ve Win je Notepad++ a ten umi hromadny prepis, nahrazeni znaku atp. - je nejaka obdoba v Deb-linux? To by dost zjednodusilo takovy prepis skriptu pro jine prostredi ..
Uff, ty mne dáváš. Zenity jede na Xkách. Takže to spustíš snad všude vyjma absolutně čistého Waylandu. A to má jen pár lidí, protože většina distribucí většinou přidává Xwayland kvůli zpětné kompatibilitě.
Hromadný přepis umí skoro každý normální texťák. Dost často to používám, na přejmenování proměnných, funkcí ap. Ale přepisovat takto skript pro jiné prostředí, si troufnu říct že nebude fungovat.
Hromadný přepis v neovimu (můj best už spousty let) a tím pádem ve vimu (kdysi jediný normální texťák):
ESC na základní mód
:%s/co chceš přepsat/čím to přepsat/gc
ENTER
Přepis v micro textovém editoru (je to fakt bomba. Jediná chybka že neumí LSP):
ctrl+e
replace "co chceš přepsat" "čím to přepsat"
ENTER
potvrzení klávesou y
Nano:
alt+r
co chceš nahradit
ENTER
čím to nahradit
ENTER
potvrzení klávesou a
-
ramaeli díky, běhá to, ale:
1) postrádám tam část, která bude spouštět příslušné subskripty (resp. asi tam alespoň v základu je, ale nevidím ji) - čili poprosím o doplnění v tom smyslu (subskripty budiž třeba a.sh, b.sh a c.sh);
2) potřebuju, aby se okno po volbě libovolné z aktivních hodnot (tzn. některého z nabízených tlačítek => subskriptů kromě Storno) nezavřelo, ale bylo připravené na další volbu (jde to, ejaj vytvořený kód to umí).
Vážně nejsem programátor, takže mě ber s rezervou ;-) Zvládám s odřenýma ušima jednoduché věci v Basicu, nějaké úplné základy z Arduino IDE apod.
Edit: krůček už jsem udělal a snad to ty subskripty spouští:
#! /usr/bin/env bash
odpoved=$(zenity --info --title 'Moje okno' \
--text 'Vyber si:' \
--extra-button PRVA \
--extra-button DRUHA \
--extra-button TRETI \
--ok-label Storno\
)
navrat=$?
# Test návratové hodnoty
if [ $navrat -eq 0 ]; then
exit 0
fi
# Testy odpovědí
case $odpoved in
PRVA) ./a.sh
;;
DRUHA) ./b.sh
;;
TRETI) ./c.sh
;;
esac
Jdeš na to správně.
#! /usr/bin/env bash
navrat=1
while [ $navrat -eq 1 ]; do
odpoved=$(zenity --info --title 'Moje okno' \
--text 'Vyber si:' \
--extra-button PRVA \
--extra-button DRUHA \
--extra-button TRETI \
--ok-label Storno\
)
navrat=$?
# Testy odpovědí
case $odpoved in
PRVA) ./a.sh
;;
DRUHA) ./b.sh
;;
TRETI) ./c.sh
;;
esac
done
Okno ve smyčce. Jen se musela změnit podmínka návratové hodnoty a dát to do smyčky while. Ono v bash se dost blbě něco píše, chce to jinak myslet.
Arduino je důvod proč jsem si nedávno zaneřádil systém Xkama. Pořídil jsem si nové převodníky USB/UART na programování Atmelů. No a chvíli na to mne skolil Covid. Po pár dnech kdy jsem se trochu zmátořil a začal více vnímat mne zarazilo ticho. Nešla chladnička. Odešel ten regulátor teploty. Je to 20 let starý kousek a nedařilo se mne na internetu sehnat tu blbost s trubičkou s plynem. A páč věcem nejradši dávám další život. Napsal jsem jednoduchý prg na Atmel aby to snímalo teplotu uvnitř chladničky a podle toho spouštělo přes SSR relátko kompresor. Jenže jak jsem byl ještě trochu mentálně mimo, nedařilo se mne chip flashnout tím novým převodníkem. A tak jsem to hodil do arduina a nejjednodušší bylo nainstalovat tu jejich parodii na IDE. A tím se mi dostali Xka do systému. Ale chladnička jede jako fík. Při dosažení 4,5°C se kompresor vypne a zapne se až při 7°C.
-
ramael: jo jo, okno už zůstává otevřené, díky. Ještě to později vyzkouším s reálnými subskripty a pokud bude vše fungovat, tak spokojenost :-)
Mimochodem: šlo by všechny skripty (tedy tento hlavní probíraný a ty ovládací subskripty) spojit do jednoho?
-
ramael: jo jo, okno už zůstává otevřené, díky. Ještě to později vyzkouším s reálnými subskripty a pokud bude vše fungovat, tak spokojenost :-)
Mimochodem: šlo by všechny skripty (tedy tento hlavní probíraný a ty ovládací subskripty) spojit do jednoho?
Samozřejmě. Tam kam jsi zadal názvy subskriptů napiš přímo jejich obsah. Jako jsem měl v prvním příkladě dvě echa.
-
Ještě dodatek. Jde si to samozřejmě pojmenovat i lidštěji:
#! /usr/bin/env bash
navrat=1
while [ $navrat -eq 1 ]; do
odpoved=$(zenity --info --title 'Moje okno' \
--text 'Vyber si:' \
--extra-button "První sekvence" \
--extra-button "Ty ty ty zlobivý porte" \
--extra-button TRETI \
--ok-label Storno\
)
navrat=$?
# Testy odpovědí
case $odpoved in
"První sekvence") ./a.sh
;;
"Ty ty ty zlobivý porte") ./b.sh
;;
TRETI) ./c.sh
;;
esac
done
A pak bych se ještě osobně přikláněl nechat to v oddělených scriptech. Ta fragmentace z monolitického scriptu (programu, funkce atd.) je lepší na hledání chyb, či příští úpravu. Časem se třeba bude něco muset poupravit. A v monolitu to budeš muset najít a něco přepsat. Vzniká možnost chyby. Kdežto kousky kódů se spravují lépe.
Na záložky jako takové zenity není. Více i s příklady tady https://help.gnome.org/users/zenity/stable/index.html.en
-
Jestli by nebylo nakonec lepsi si nezjistit, jak vyuzit tu zakladni stavbu oken primo na urovni WM.
Nekdy na to zkusim, jen tak akademicky, mrknout ..
-
Mrkni jeste na tcl/tk
-
:) :) :) :) ;D ;D ;D ;D
Mno, co na to říct. To zenity je to nejjednodušší co vlastně existuje. @Ventero zkus si něco naprogramovat sám, jen nějakou blbůstku a uvidíš co to je za mazec. A na úrovni WM ještě větší.
S TK nějaké zkušenosti mám (https://stackoverflow.com/questions/68879210/how-to-add-a-button-in-a-toplevel-window/68879554#68879554).
Pokud chceš fakt něco hodně jednoduchého, univerzálnějšího bez zenity omezení, tak bude nejjednodušší si to napsat jako web a socketem ovládat. Pomocí node.js to jde docela dobře. Ale pořád to bude o řád více práce než se zenity.
-
Jojo - vim. Kolikrat staci slozitejsi konfigurace Grub2.
Jde mi o to, jak to gui okno udelat nezavisle na prostredi a na dalsich rekvizitach, aby se to dalo spustit nejlepe napric distry (alespon deb-based) bez ohledu na DE a bez nutnosti instalovat dalsi veci, at uz je to Zenity, Python atd.
Neco, co proste hned spustim at uz v Ubuntu, Kubuntu, Xubuntu, Debianu atp.
-
Jojo - vim. Kolikrat staci slozitejsi konfigurace Grub2.
Jde mi o to, jak to gui okno udelat nezavisle na prostredi a na dalsich rekvizitach, aby se to dalo spustit nejlepe napric distry (alespon deb-based) bez ohledu na DE a bez nutnosti instalovat dalsi veci, at uz je to Zenity, Python atd.
Neco, co proste hned spustim at uz v Ubuntu, Kubuntu, Xubuntu, Debianu atp.
Vždycky budeš muset něco nainstalovat. To zenity běží ve všem co jsi vzpomenul. On bash není určen na gui aplikace. Proto bude muset být propojen přes nějakého prostředníka. Pokaždé budeš muset nainstalovat nějakou podporu. Záleží jen na tvůrci jaký jazyk je mu nejbližší.
Buď nechápu o co ti jde. Nebo ty nechápeš že ...
Pokud nechceš TK, je hodně dobrá volba pyglet: https://pyglet.org/ Vlastně je to lepší volba.
Je to hodně rychlé, běží to jak na X tak Waylandu. Učil jsem na tom sinus cosinus, formou ovládání otáčení autíčka. Vysvětloval jsem na tom jak je i ta základní matematika důležitá i jen na takovou blbinku jako je otáčení autíčka ve hrách z ptačí perspektivy. Ale jako každá pythoní věc se to musí potento... Hned v úvodu https://github.com/pyglet/pyglet je vidět velká bolest pythonu. Mění se API a něco nemusí fungovat. Proto v pythonu píšu už jen maximálně když něco potřebuju rychle, ale ne na dlouho. Zkrátka držím se od něho dál.
Pak je napříč X a Waylandem https://love2d.org/
Také dost dobré a navíc pro jazyk LUA. Jazyk vznikl pro neprogramátory. Dá se dobře naroubovat skoro do všeho, protože má hodně mrňavý preprocesor. V jazyce lua je naprogramován best texťák neovim. Lua je v conky, yazi, snad všude.
Pak tu máme mega počiny typu GNOME: https://developer.gnome.org/documentation/tutorials.html nebo KDE https://develop.kde.org/hig/
Tohle byli příklady knihoven které tě odstíní od low levelu. Vynechal jsem schválně GTK4 a další.
Jupí na nižší věci: https://wayland-book.com/introduction.html nebo konkurece z X https://en.wikibooks.org/wiki/OpenGL_Programming# oboje pro C++ (skvělý, všestranný jazyk). Anebo https://medium.com/@dbiro97/understanding-linux-graphical-stack-by-creating-a-window-7f82182ee19 Příklad v rustu. Rust je teď můj favorit. Ještě s ním bojuju, ale líbí se mi ta rychlost a univerzálnost. Jen je třeba u tohoto jazyka jinak přemýšlet.
Takhle jsi to myslel s nezávislostí na DE? Věci z GNOME ti pofrčí tak i tak na KDE a naopak také. Lowlevel X ti poběží kdekoliv kde bude Xserver a lowlevel Wayland kdekoliv kde bude Wayland server.
Ale ať si z toho vybereš cokoliv a zvládneš to, určitě na to nebudeš roubovat nějaký bash skript. To už si nativně nasmolíš přímo v příslušném jazyce.
-
Taky přisypu:
vychází ze Zenity
https://sourceforge.net/projects/yad-dialog/
A tady máš něco od Basicu, kdybys měl nostalgickou...
https://gambas.sourceforge.net/en/main.html
Nebo provařený QT Creator...
Anebo nahoď bakšiš a seženu dělníka, který s tím má zkušenosti v Lin a Win a je levný.
-
Yad byl právě použit v tom grubdoctor, jak jsem odkazoval a tím, že ze Zenity vychází fungoval ten přímý přepis.
jen mě mrzí, že nejdou udělat záložky. To je za mě to Zenity nedotáhlé.
Moje představa je asi taková, že se udělá stejné okno jako když spustím např. Network manager.
A Pythonu se právě chci vyhnout - to jde vidět na hp-lip, že to není zrovna spolehlivé řešení a cesta pekelná.
Takže, jestli jsem pochopil dobře, tak to jde jedině přímo jako GTK (tedy asi nějaký GTK Creator) a to je příliš složité ..
Jinak to tcl/tk - u toho někde psali, že to pak spustíš nezávisle na čemkoliv a jinde, že je třeba doinstalovat to "tk" ..
A ten Tkinter je zase via Python.
Edit:
Aha "Většina operačních systémů Linux je dodávána s vestavěným Tcl a v těchto systémech můžete okamžitě začít."
https://www.tutorialspoint.com/tcl-tk/tcl_environment.htm
Ale ještě jsem nenašel, jestli v tcl/tk jdou udělat ty záložky. Ale tím, že to volá wm (chápu jako windows manager), tak by to jít mělo ..
Ono to možná půjde nějak i v tom Zenity, když se to šikovně navlíkne. Ale i to už je pro mě složité se tím prokousávat a učit se programovat ..
-
Tady je super tutoriál pro Zenity. Akorát, že u všeho pak jen lakonicky připíšou "výstup je třeba přiřadit proměnné"a "výstupovou logiku dále použít" atp., což je zase pro neznalce nicmoc, bo neví jak. A pak se naučit syntaxi těch podmínek a proměnných. To by zase zabralo času ..
https://ostechnix.com/zenity-create-gui-dialog-boxes-in-bash-scripts/
Něco pak napoví zase jiné ukázky jinde - např.:
https://www.tomshardware.com/software/linux/how-to-create-a-custom-linux-app-menu-with-zenity
Takže takhle toho hromadu pročíst, prozkoušet - no hotový koníček, na který mi tedy fakt moc nezbývá ..
-
A co TUI, nebude stačit?
https://youtu.be/FJ7KJXmZRXA?t=782 (https://youtu.be/FJ7KJXmZRXA?t=782)
https://unix.stackexchange.com/questions/285777/how-do-i-create-a-terminal-based-gui
-
Tady je super tutoriál pro Zenity. Akorát, že u všeho pak jen lakonicky připíšou "výstup je třeba přiřadit proměnné"a "výstupovou logiku dále použít" atp., což je zase pro neznalce nicmoc, bo neví jak. A pak se naučit syntaxi těch podmínek a proměnných. To by zase zabralo času ..
https://ostechnix.com/zenity-create-gui-dialog-boxes-in-bash-scripts/
Něco pak napoví zase jiné ukázky jinde - např.:
https://www.tomshardware.com/software/linux/how-to-create-a-custom-linux-app-menu-with-zenity
Takže takhle toho hromadu pročíst, prozkoušet - no hotový koníček, na který mi tedy fakt moc nezbývá ..
Tak já teda ten můj script okomentuji:
*Shebank
#! /usr/bin/env bash
*Nastavení proměnné která bude uchovávat návratovou hodnotu (exit) ze Zenity
*Rovnou ji přednastavíme na úspěch
navrat=1
*Smyčka která testuje tu návratovou hodnotu. Pokud to bude jednička, smyčka se zopakuje a otevře okno Zenity
while [ $navrat -eq 1 ]; do
*A tady nastává to kouzlo a přiřazuje se výstup/výběr do proměnné s názvem odpoved
*Zenity se spustí v subshelu
odpoved=$(zenity --info --title 'Moje okno' \
--text 'Vyber si:' \
--extra-button "První sekvence" \
--extra-button "Ty ty ty zlobivý porte" \
--extra-button TRETI \
--ok-label Storno\
)
*Do proměnné navrat se zapíše návratová hodnota předchozího příkazu
*což je subshel se zenity
navrat=$?
*Testy odpovědí = výstupová logika
case $odpoved in
"První sekvence") ./a.sh
;;
"Ty ty ty zlobivý porte") ./b.sh
;;
TRETI) ./c.sh
;;
*Ukončení testu case
esac
*Návrat smyčky. Pokud bude proměnná navrat mít hodnotu nula
*znamená to že se kliklo na tlačítko ok-label s mnou přiřazeným názvem Storno
*smyčka se zde ukončí
done
Ta syntaxe je jen bash, nic jiného.
Vážně by mě zajímalo, a myslím fakt vážně. Jak by sis představoval aby to fungovalo? A tím nemyslím "chci záložky"! Tím myslím co ty jako uživatel bys chtěl napsat a ono se to bude podle toho chovat.
-
Jde mi v podstatě o totéž, co psal Roman - zjednodušení a zkrácení času. Akorát mi šlo o širší možnost to strukturovat a rozvětvit, aby to bylo stále přehledné. A ne aby to vypadalo, jako Clonezilla, Testdisk apod. Tedy udělat nějaké GUI prostředí/rozhraní pro kombinované spouštění jednotlivých utilit a skriptů s tím, že by je to sjednocovalo, bylo to přehledné a nemuselo se to všechno vypisovat v terminálu. A to tak, že tam ale půjdou volit parametry z nějaké nabídky (předepsaný paramlist) a příp. ještě dopsat.
A proto jsem vzpomněl záložky. Stejně tak třeba rozbalovací nabídka. Abych nespouštěl tupě skripty, ale měl možnost tam zadávat hodnoty, určovat zdroj/cíl apod. Jinak nemám úplně konkrétní představu ani nemůžu - ta by se vyvrbila, až bych tu slátaninu tvořil.
Ale v pohodě - když by se to člověk schopně naučil s tím Zenity, tak by se to dalo udělat celkem uspokojivě. I kdyby tak, že by se udělal soubor jednotlivých oken pro každou utilitu zvlášť a pak se to jen zastřešilo jedním generálním rozcestníkovým oknem. Akorát pak zajistit, aby se to pak nějak vrátilo k tomu hlavnímu rozhranní. Ostatně takto byly koncipovány některé vypalovací aplikace např.
U mě bude problém hlavně to samotné programování. Kdysi jsem něco psal v Basic, ale to je úplně jiná logika struktury, než dnešní zápisy. Dnes je spousta operandů v syntaxi a mě to přijde trochu nepřehledné.
Třeba když porovnám Grub1 (ještě lépe grub4dos třeba) a Grub2 - závorky, středníky, složené závorky, rovná lomítka apod. - to si prostě nejsem schopný pamatovat a přijde mi to spíše zmatečné - nevím čemu to prospělo, ale zjednodušení a přehlednosti zápisu rozhodně ne. Snad jedině, že to ušetří znaky a zápis to zkrátí - ale tím si taky nejsem jist, zda to platí vždy ..
Dík moc za zájem, ale kašli na to, vnímám čímdálvíc, kolik by to dalo práce i přes to, že bych to byl schopen realizovat. Jen jsem měl nějakou vizi, a po prvním seznámení s fakty (díky Tobě i) vím, že na to nejspíše nemám energii a asi ani dost prostoru.
-
Ramaeli, prosím ještě o další pomoc... O co jde:
mám dle Tvého mustru víceméně finální kód pro Zenity, kde spouštím jednotlivé subskripty. Vše funguje, až na tlačítko "SOUBOR", kterým se spustí subskript pro odeslání textového testovacího souboru.
Testovací soubor je úmyslně značně velký a tím i jeho odesílání trvá dlouho (asi 1040 vteřin), přičemž ale hned po stisknutí tlačítka "SOUBOR" dojde k nežádoucímu zavření okna Zenity (procesy bash a cat zůstanou běžet na pozadí). Ostatní tlačítka (pochopitelně kromě Storna) okno nezavřou...
Všechny použité skripty a soubory jsou v příloze. Mám (zcela laický) dojem, že k zavření (či vlastně pádu?) okna dochází právě proto, že subskript neproběhne v dostatečně krátkém čase...
Díky.
Edit: tak jsem ten textový testovací soubor zkusil cca 400x zmenšit a chová se to tak, že okno Zenity zmizí na dobu odesílání souboru po RS232, načež se zase znovu objeví (čili ve skutečnosti se nezavře definitivně, ani nespadne, jen bych prostě u nezmenšeného souboru musel čekat těch cca 1040 vteřin).
Je tohle chování Zenity normální, resp. dá se tomu nějak zabránit?
-
Tukam z mobilu v praci. Ano okno se objevi az po dokonceni riidici logiky. Dej za spoustene skripty & Tim by se meli spustit na pozadi a nebude se na ne cekat.
-
Jo, okno se po přidání & už nezavírá, skvělé. Přesná syntaxe je
./konkretni_skript.sh &
(to jen kvůli mezerám a kolik, kdo to má vědět ;-) )
Nově se (asi logicky?) okno zavřelo po stisku tlačítka "SOUBKONEC", protože se příslušným subskriptem zabíjely procesy cat a bash, ale to jsem vyřešil omezením na zabití cat, takže teď už se zdá, že to dělá všechno co má...
Díky moc.
-
Není zač.
Ještě doplním že si můžeš uložit pid procesu na pozadí a ten dle potřeby zabít. To jen aby sis zbytečně nezabíjel všechny caty a bashe atd.
Otestuj si to:./testodeslsoub.sh &
POSLEDNI_PID=$!
kill -9 $POSLEDNI_PID
No a ještě doporučuju ten shebank napsat již spousty let po novu:
#!/usr/bin/env bash
-
Ramael: jo, já jsem taky uvažoval o zabití dle konkrétního PID, ale popravdě moc nechápu funkci toho kódu, co jsi poslal výše (tím spíš, že je nějak spojený se subskriptem testodeslsoub.sh - ten se napřed spustí a pak hned zabije???).
Smyslem subskriptu testkonecodesl.sh je ukončit cat (předtím spuštěný subskriptem testodeslsoub.sh), pokud přenos trvá příliš dlouho (ale myslím, že Tobě to je jasné)...
Při experimentech s PID se trochu obávám, aby se PID nějak nezměnil, chybně určil apod. a nezabilo se něco jiného. Proces cat s největší pravděpodobností poběží vždy jen jeden (ten spuštěný subskriptem testodeslsoub.sh), čili nebude moc hrozit, že by se zabily i nějaké další. Místo pkill jsem nyní použil killall, aby to "náhodou" nezabilo i jiný proces s názvem obsahujícím podřetězec "cat" (pokud správně chápu výklad funkce pkill).
Ten shebang jsem už včera přepsal podle toho, jak to máš (tedy "po novu", jakkoliv novinky čím dál víc nesnáším), někde jsem se dočetl, že to nějak usnadňuje hledání proměnných či co. No prostě pracuje mi to i s tímto "po novu" způsobem...
-
Kousek z řídící logiky
SOUBOR) ./testodeslsoub.sh &
PID_NA_ZABITI=$!
# uloží se pid posledního skriptu spuštěného na pozadí
# takže si ten pid uložíme hned po spuštění
;;
SOUBKONEC) kill -9 $PID_NA_ZABITI
# místo stop skriptu rovnou zamorduje skript ./testodeslsoub.sh
;;
Ten pid se v rámci běžícího procesu nemění. Bude jiný až při dalším spuštění. A tak se hodnota pidu uloží hned po spuštění. A pak už můžeš proces(skript) kontrolovat pomocí té proměnné.
"Po novu" už je to více jak deset let :)
-
Díky, takhle už je kód jasnější, zkusím to tam změnit.
Edit: vyzkoušeno, bohužel verze s pid nezastaví odesílání souboru (zabije to totiž jen proces bash a cat zůstane v běhu). Asi by se musely identifikovat pidy jak bash, tak cat (při spuštění subskriptem přímo v něm) a zabít je pak v hlavním skriptu oba, ne?
Ale nemusíme to hrotit, ta verze s killall cat funguje, jak už jsem psal výše a pro moje účely úplně stačí.
-
No jo no, chybička se vloudila. Takže oprava:
SOUBKONEC) pkill -9 -P $PID_NA_ZABITI
Z man stránky:
man --pager='less -p "-P,"' pkill
-
@Ventero ten YAD vypadá hodně dobře. Tady je to co chceš: https://yad-guide.ingk.se/notebook/yad-notebook.html
Protože Bash není zrovna moc intuitivní jazyk. Je určen na správu systému, proto krkolomná syntaxe. Tak ti přeju ať tě nepostihne šílenství při vytváření si vlastního GUI.
Myslím že by bylo lepší se naučit nějaký normální programovací jazyk.
-
Diky. Mrknu na to
-
Díky za opravu, takhle už to zabije bash i cat, ale nesmí se (třeba omylem) stisknout tlačítko SOUBOR víckrát. To se pak catů i bashů spustí několik a tlačítkem SOUBKONEC se dá zabít pouze jedna dvojice (logicky).
Když nezabíjím dle pidu, ale dle názvu, tak to funguje lépe (prostě to zabije - třeba i postupně - všechny procesy bash a cat).
Mně je jasné, že by tam asi šlo postupně načítat více pidů dle počtu (nechtěných) spuštění, ale vážně to nemá smysl dál komplikovat, mně ta funkce verze s killall dle názvu zcela vyhovuje. Leda že bys to měl jako dobrovolné mozkové cvičení ;-)
No jo no, chybička se vloudila. Takže oprava:
SOUBKONEC) pkill -9 -P $PID_NA_ZABITI
-
To znělo jako výzva :))
SOUBOR)
# Pokud už není PID, spusť skript
# Předejde se vícenásobnému spuštění
if [[ ! $PID_NA_ZABITI ]]; then
# skript je spuštěn na pozadí.
# Po ukončení se automaticky vymaže proměnná PIDu
./testodeslsoub.sh & PID_NA_ZABITI=
# Ale než se ukončí, nastavíme proměnnou na jeho PID
PID_NA_ZABITI=$!
fi
;;
SOUBKONEC)
# Test jestli existuje spuštěný proces
# Jinak bysme mohli zabít komplet DE - vlastní
# zkušenost je těžko přenositelná :D
if [[ $PID_NA_ZABITI ]]; then
# Výpis všech potomků zabíjeného skriptu
# A rovnou jejich zabití - tím se skript ukončí
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
# Vymazání hodnoty PIDu
PID_NA_ZABITI=
fi
;;
On totiž i ten pkill není tak dokonalý jak se tváří.
Takhle je to ošetřené proti ukliknutím.
-
Potvrzuju funkci po této poslední opravě, jsi vážně dobrej, díky.
Edit: hm, tak zase to není úplně ono ;-) Pokud nechám přenos souboru doběhnout přirozeně do konce (tedy nezabiju ho tlačítkem SOUBKONEC), tak nelze spustit nový přenos. Tlačítko SOUBOR "nějak" zareaguje (obvyklým zmizením okna Zenity na velmi krátký okamžik), ale to je všechno... Zatím jsem se nedíval do správce procesů, co běží a co ne.
Edit #2: tak běžet zůstane pouze jeden bash (ten, co v něm bylo spuštěno okno Zenity), bash i cat pocházející ze subskriptu pro přenos se zabijí. Nicméně přenos souboru nelze spustit znovu (po zavření okna a novém spuštění už ano).
Edit #3: pomůže, když tlačítko SOUBKONEC stisknu i poté, co přenos doběhl přirozeně (resp. přes to). Ve správci procesů ale není přitom vidět žádná změna...
Původní verze s killall a jmény procesů tímto neduhem netrpí.
Neber to jako výzvu, jen prostě popisuju realitu.
Doplňuju příslušný kód:
#! /usr/bin/env bash
# autor principu: ramael (https://forum.ubuntu.cz/index.php?topic=86616.0)
# úprava vedoucí k zabití celého skriptu místo procesu cat
navrat=1
while [ $navrat -eq 1 ]; do
odpoved=$(zenity --ellipsize --info --title "Test panelu GERCOM" \
--text="Zvolte funkci (režim SETUP je nutno ukončit vypnutím panelu!)" \
--extra-button MAZÁNÍ \
--extra-button MOŽNOSTI \
--extra-button VYPLŇH \
--extra-button SETUP \
--extra-button SOUBOR \
--extra-button SOUBKONEC \
--ok-label ZAVŘÍT_OKNO\
)
navrat=$?
# Testy odpovědí
case $odpoved in
MAZÁNÍ) ./testmaz.sh &
;;
VYPLŇH) ./testh.sh &
;;
MOŽNOSTI) ./testmozn.sh &
;;
SETUP) ./testsetup.sh &
;;
SOUBOR)
# Pokud už není PID, spusť skript
# Předejde se vícenásobnému spuštění
if [[ ! $PID_NA_ZABITI ]]; then
# skript je spuštěn na pozadí.
# Po ukončení se automaticky vymaže proměnná PIDu
./testodeslsoub.sh & PID_NA_ZABITI=
# Ale než se ukončí, nastavíme proměnnou na jeho PID
PID_NA_ZABITI=$!
fi
;;
SOUBKONEC)
# Test jestli existuje spuštěný proces
# Jinak bysme mohli zabít komplet DE - vlastní
# zkušenost je těžko přenositelná :D
if [[ $PID_NA_ZABITI ]]; then
# Výpis všech potomků zabíjeného skriptu
# A rovnou jejich zabití - tím se skript ukončí
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
# Vymazání hodnoty PIDu
PID_NA_ZABITI=
fi
;;
esac
done
-
No jo, jsou věci...
A pak jsou opravy:SOUBOR)
# Pokud už není PID, spusť skript
# Předejde se vícenásobnému spuštění
if [[ ! $PID_NA_ZABITI ]] || [ ! -d /proc/$PID_NA_ZABITI ]; then
# skript je spuštěn na pozadí.
./testodeslsoub.sh &
# Nastavíme proměnnou na jeho PID
PID_NA_ZABITI=$!
fi
;;
A ještě pro jistotu:
začátek skriptu:
#! /usr/bin/env bash
PID_NA_ZABITI=
navrat=1
while [ $navrat -eq 1 ]; do
...
...
...
a konec skriptu:
...
...
...
esac
done
if [[ $PID_NA_ZABITI ]]; then
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
fi
Ty jo, teď už je to kompletně ošetřený. Přidal jsem ještě, že když ukončíš okno, tak to taky zabije ty procesy.
Jak už jsem psal výše, bash není nejlepší jazyk na psaní a obsluhu grafického rozhraní. A řekl bych, že díky jeho složité (krkolomné) syntaxi má pak dost lidí zbytečný strach z normálních programovacích jazyků.
-
Můžu Tě požádat, abys ty všechny změny doplnil do předposlední verze skriptu tak, jak jsem ji (pro změnu já) doplnil do předchozího příspěvku?
Ta přehlednost je pro mě totiž opravdu nulová, nebo spíš záporná...
-
#! /usr/bin/env bash
# úprava vedoucí k zabití celého skriptu místo procesu cat
PID_NA_ZABITI=
navrat=1
while [ $navrat -eq 1 ]; do
odpoved=$(zenity --ellipsize --info --title "Test panelu GERCOM" \
--text="Zvolte funkci (režim SETUP je nutno ukončit vypnutím panelu!)" \
--extra-button MAZÁNÍ \
--extra-button MOŽNOSTI \
--extra-button VYPLŇH \
--extra-button SETUP \
--extra-button SOUBOR \
--extra-button SOUBKONEC \
--ok-label ZAVŘÍT_OKNO\
)
navrat=$?
# Testy odpovědí
case $odpoved in
MAZÁNÍ) ./testmaz.sh &
;;
VYPLŇH) ./testh.sh &
;;
MOŽNOSTI) ./testmozn.sh &
;;
SETUP) ./testsetup.sh &
;;
SOUBOR)
# Pokud už není PID, spusť skript
# Předejde se vícenásobnému spuštění
if [[ ! $PID_NA_ZABITI ]] || [ ! -d /proc/$PID_NA_ZABITI ]; then
# skript je spuštěn na pozadí.
./testodeslsoub.sh &
# nastavíme proměnnou na jeho PID
PID_NA_ZABITI=$!
fi
;;
SOUBKONEC)
# Test jestli existuje spuštěný proces
# Jinak bysme mohli zabít komplet DE - vlastní
# zkušenost je těžko přenositelná :D
if [[ $PID_NA_ZABITI ]]; then
# Výpis všech potomků zabíjeného skriptu a jejich zamordování
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
# Vymazání hodnoty PIDu
PID_NA_ZABITI=
fi
;;
esac
done
# Smyčka byla ukončena. Pokud je ještě skript aktivní
# zamordujem jeho potomky včetně něho samotného
if [[ $PID_NA_ZABITI ]]; then
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
fi
-
Tak snad už naposledy za toto díky.
Zdá se, že to už opravdu dělá korektně všechno tak, jak má...
-
Nemáš zač.
Mne tyhle věci posouvají dál. A tohle bylo k závěru hodně zajímavé. Vybrat si cestu jakou se dát. Nakonec jsem se rozhodl pro build-in test -d než ps, grep a testy výsledků. Šlo by to udělat i pomocí trap, jenže to bys musel vložit do skriptu který má být pod kontrolou. Ale to odporuje mému přesvědčení o umístění a nedelegování řídící logiky na věci které mají v podstatě vykonávat jen na co byly prvoplánovány.
-
Tak jsem dnes zjistil ještě jednu chybku - není zásadní, ale... Okno Zenity nelze zavřít normálně křížkem, ale je potřeba zvolit funkci "ZAVŘÍT_OKNO".
To je normální?
Dělají to i dřívější verze uvedené v tomto vlákně.
-
#! /usr/bin/env bash
odpoved=$(zenity --info --title 'Moje okno' \
--text 'Vyber si:' \
--extra-button PRVA \
--extra-button DRUHA \
--extra-button TRETI \
--extra-button CTVRTA \
--ok-label Storno\
)
navrat=$?
# Test návratové hodnoty
if [ $navrat -eq 0 ]; then
exit 0
fi
# Testy odpovědí
case $odpoved in
PRVA) echo "$odpoved jsi si vybral"
echo "Ty dva oddělovací středníky jsou důležité"
;;
DRUHA) echo "Fakt chceš dvojku?"
;;
TRETI) echo "$odpoved - tak ta se ti vymstí"
;;
CTVRTA) echo "$odpoved je ta správná volba. Už jsi profík :D"
;;
esac
Myslím, že je to dost názorně napsáno, takže vzhůru do úprav. Na ten script si udělej spouštěč na ploše a hotovo.
Tenhle také nejde zavřít křížkem? Bohužel to nemohu odzkoušet, protože moje DE na oknech křížky a podobné ptákoviny nedělá.
-
Jo, ten zavřít křížkem lze ;-)
Příležitostně se podívám, kde je rozdíl a zkusím to v tom smyslu změnit... Zatím mi neprozrazuj nic, musím trochu potrénovat mozek ;-)
Díky.
Edit #1: tak odvolávám, co jsem odvolal a vzdávám vlastní pokusy. Jen si tipnu: nedělá tu nemožnost zavření křížkem ten Tebou popsaný princip testu, zda neexistuje spuštěný proces?
-
#! /usr/bin/env bash
# úprava vedoucí k zabití celého skriptu místo procesu cat
PID_NA_ZABITI=
navrat=1
while [ $navrat -eq 1 ]; do
odpoved=$(zenity --ellipsize --info --title "Test panelu GERCOM" \
--text="Zvolte funkci (režim SETUP je nutno ukončit vypnutím panelu!)" \
--extra-button MAZÁNÍ \
--extra-button MOŽNOSTI \
--extra-button VYPLŇH \
--extra-button SETUP \
--extra-button SOUBOR \
--extra-button SOUBKONEC \
--ok-label ZAVŘÍT_OKNO\
)
navrat=$?
# Test návratové hodnoty
if [ $navrat -eq 0 ]; then
if [[ $PID_NA_ZABITI ]]; then
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
fi
exit 0
fi
# Testy odpovědí
case $odpoved in
MAZÁNÍ) ./testmaz.sh &
;;
VYPLŇH) ./testh.sh &
;;
MOŽNOSTI) ./testmozn.sh &
;;
SETUP) ./testsetup.sh &
;;
SOUBOR)
# Pokud už není PID, spusť skript
# Předejde se vícenásobnému spuštění
if [[ ! $PID_NA_ZABITI ]] || [ ! -d /proc/$PID_NA_ZABITI ]; then
# skript je spuštěn na pozadí.
./testodeslsoub.sh &
# nastavíme proměnnou na jeho PID
PID_NA_ZABITI=$!
fi
;;
SOUBKONEC)
# Test jestli existuje spuštěný proces
# Jinak bysme mohli zabít komplet DE - vlastní
# zkušenost je těžko přenositelná :D
if [[ $PID_NA_ZABITI ]]; then
# Výpis všech potomků zabíjeného skriptu a jejich zamordování
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
# Vymazání hodnoty PIDu
PID_NA_ZABITI=
fi
;;
esac
done
# Smyčka byla ukončena. Pokud je ještě skript aktivní
# zamordujem jeho potomky včetně něho samotného
if [[ $PID_NA_ZABITI ]]; then
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
fi
Snad opraveno.
-
...
Snad opraveno.
Bohužel ani toto nelze zavřít křížkem...
-
Jo, ten zavřít křížkem lze ;-)
Příležitostně se podívám, kde je rozdíl a zkusím to v tom smyslu změnit... Zatím mi neprozrazuj nic, musím trochu potrénovat mozek ;-)
Díky.
Edit #1: tak odvolávám, co jsem odvolal a vzdávám vlastní pokusy. Jen si tipnu: nedělá tu nemožnost zavření křížkem ten Tebou popsaný princip testu, zda neexistuje spuštěný proces?
A sakra, jsem to postnul aniž bych zaregistroval že to chceš zkusit najít sám.
Ne, dělala to nekontrola návratové hodnoty zenity. Jsem ji vypustil v dobré víře. Nějak mě nedošlo, že lidi mají okna s křížkama ap. Moje chyba.
-
To mi nedává smysl. Anebo mám už za tento týden v hlavě dost nak..áno.
#! /usr/bin/env bash
# úprava vedoucí k zabití celého skriptu místo procesu cat
PID_NA_ZABITI=
navrat=1
while [ $navrat -eq 1 ]; do
odpoved=$(zenity --ellipsize --info --title "Test panelu GERCOM" \
--text="Zvolte funkci (režim SETUP je nutno ukončit vypnutím panelu!)" \
--extra-button MAZÁNÍ \
--extra-button MOŽNOSTI \
--extra-button VYPLŇH \
--extra-button SETUP \
--extra-button SOUBOR \
--extra-button SOUBKONEC \
--ok-label ZAVŘÍT_OKNO\
)
navrat=$?
# Test návratové hodnoty
if [ $navrat -eq 0 ]; then
exit 0
fi
# Testy odpovědí
case $odpoved in
MAZÁNÍ) ./testmaz.sh &
;;
VYPLŇH) ./testh.sh &
;;
MOŽNOSTI) ./testmozn.sh &
;;
SETUP) ./testsetup.sh &
;;
SOUBOR)
# Pokud už není PID, spusť skript
# Předejde se vícenásobnému spuštění
if [[ ! $PID_NA_ZABITI ]] || [ ! -d /proc/$PID_NA_ZABITI ]; then
# skript je spuštěn na pozadí.
./testodeslsoub.sh &
# nastavíme proměnnou na jeho PID
PID_NA_ZABITI=$!
fi
;;
SOUBKONEC)
# Test jestli existuje spuštěný proces
# Jinak bysme mohli zabít komplet DE - vlastní
# zkušenost je těžko přenositelná :D
if [[ $PID_NA_ZABITI ]]; then
# Výpis všech potomků zabíjeného skriptu a jejich zamordování
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
# Vymazání hodnoty PIDu
PID_NA_ZABITI=
fi
;;
esac
done
# Smyčka byla ukončena. Pokud je ještě skript aktivní
# zamordujem jeho potomky včetně něho samotného
if [[ $PID_NA_ZABITI ]]; then
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
fi
A takhle? To asi křížkem půjde, ale neukončí spuštěný proces (ten křížek).
Pokud tohle křížkem půjde, dej vědět a já zkusím vymyslet jak přidat ukončení procesů ke křížku.
-
Ne, zase to křížkem zavřít nejde.
Hele netrap se, nemá to smysl (nestojí to za to úsilí), bez křížku to taky funguje a já jsem spokojený.
Díky.
-
#! /usr/bin/env bash
# úprava vedoucí k zabití celého skriptu místo procesu cat
PID_NA_ZABITI=
navrat=1
while [ $navrat -eq 1 ]; do
odpoved=$(zenity --ellipsize --info --title "Test panelu GERCOM" \
--text="Zvolte funkci (režim SETUP je nutno ukončit vypnutím panelu!)" \
--extra-button MAZÁNÍ \
--extra-button MOŽNOSTI \
--extra-button VYPLŇH \
--extra-button SETUP \
--extra-button SOUBOR \
--extra-button SOUBKONEC \
--ok-label ZAVŘÍT_OKNO\
)
navrat=$?
# Test návratové hodnoty
if [ $navrat -eq 0 ]; then
if [[ $PID_NA_ZABITI ]]; then
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
fi
exit 0
fi
# Testy odpovědí
case $odpoved in
MAZÁNÍ) ./testmaz.sh &
;;
VYPLŇH) ./testh.sh &
;;
MOŽNOSTI) ./testmozn.sh &
;;
SETUP) ./testsetup.sh &
;;
SOUBOR)
# Pokud už není PID, spusť skript
# Předejde se vícenásobnému spuštění
if [[ ! $PID_NA_ZABITI ]] || [ ! -d /proc/$PID_NA_ZABITI ]; then
# skript je spuštěn na pozadí.
./testodeslsoub.sh &
# nastavíme proměnnou na jeho PID
PID_NA_ZABITI=$!
fi
;;
SOUBKONEC)
# Test jestli existuje spuštěný proces
# Jinak bysme mohli zabít komplet DE - vlastní
# zkušenost je těžko přenositelná :D
if [[ $PID_NA_ZABITI ]]; then
# Výpis všech potomků zabíjeného skriptu a jejich zamordování
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
# Vymazání hodnoty PIDu
PID_NA_ZABITI=
fi
;;
esac
done
# Smyčka byla ukončena. Pokud je ještě skript aktivní
# zamordujem jeho potomky včetně něho samotného
if [[ $PID_NA_ZABITI ]]; then
pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
fi
Snad opraveno.
Nevím kde je chyba, ale sem něco poslad je očistec. Tak ještě jednou..
Tenhle script je blbost. Páč ta kontrola už tam probíhá ve smyčce while.
Jsem si nainstaloval XFCE a kupodivu se mi to tu zobrazuje stejně jako ve Waylandu, bez křížku. Takže buď je chyba v Zenity nebo DE.
-
Uf, už jsem zpět na Waylandu - Hyprland ~ doma je doma. To odesílání asi bude spíš STARLINKem u mě. To je internet na bobek.
Snad si jednou najdu čas a dám sem návod jak si GUI udělat přes webový prohlížeč a socket. To je o hodně flexibilnější a funguje to všude.
-
Úplně nevím, co jsi myslel slovy "tenhle skript je blbost"... Ten poslední?
Ať už je to tak či onak, křížkem ani ten poslední pořád zavřít nejde. Ale fakt se netrap, už jsi mi toho poradil víc než dost, díky.