Belépés
Bash szkriptben billentyűzetfigyelés (MEGOLDVA)
2010. szeptember 2. – 18.55 – Wérnyúl
Sziasztok!
A gondom az, hogy nem tudom megoldani azt, hogy futtatok egy szriptet bash-ben terminálban és el szeretném kerülni, hogy ctrl-c-vel lehessen csak kilépni. (nem akarom a szkriptben éppen végrehajtásra kerülő parancsot megszakítani, csak a szkriptet egy adott ponton)
Tehát olyasmi parancs kellene, mint a - read - , de ne várakozzon mert azzal feltartja a szkript futását.
BIOS-ban DOS alatt volt ilyen lehetőség, hogy csak azt ellenőrizte, hogy a billentyűzet bufferében van-e leütött karakter és he nem volt, akkor tovább lehetett lépni, ha volt, akkor meg le lehetett kérdezni, hogy melyik karakter. Ilyesmi kellene.
Kössz.
- A hozzászóláshoz regisztráció és belépés szükséges
Hát ilyet közvetlen nem hiszem hogy tudnál csinálni, amit te szeretnél az engem leginkább az ncurses-re emlékeztet.
Max. olyat tudnék elképzelni, hogy fut a szkript a háttérben, egy másik szkript meg várja a parancsot és gombnyomásra egy jólirányzott kill-el megállítja a háttérfolyamatot.
Everybody poe-poe!
A kill-el való megállítás nem jó. Gyakorlatilag ugyanazt eredményezné, mint egy ctrl-c, mivel nem tudom kontrollálni, hogy a szkriptben éppen mi történik a kill kiadása pillanatában.
Még eszembe jutott, hogy nem muszáj bash "belső" parancs legyen amire szükségem van. Lehet ez egy program is, amit meghívok a szkript gyomrában és a visszatérési érték ($?) ellenőrzésével tudnék "elágazni".
kill-el lehet elég sok jelet küldeni, nem csak SIGTERM-et... Persze ehhez a szkriptnek is ismernie kell (esetleg SIGHUP-pal lehet szórakozni).
Everybody poe-poe!
valami konkrétabbat tudsz mondani? mert pl: a könyvtár minden pdf fájlját konvertálni akarom html-be. azt szeretném hogy a megszakítási üzenet esetén az utolsó konvertálás még lefusson, nehogy egy 100MB pdf-nek újra neki essen a következő indításkor.
tehát fel kell listáznom a cél állományokat, majd belekergetem egy ismétlődő ciklusba.minden ciklus elején vizsgálok egy feltételt, ami ha teljesül/nem teljesül a ciklus lefut.
ilyen lehet egy fájl megléte, program futása, dg bejegyzés, stb (billentyűzetet puffert még nem kellett vizsgálnom)
A "trap" a te baratod!
#!/bin/bash
trap "wait; exit 0" SIGINT SIGTERM
./dojob_1 &
wait
./dojob_2 &
wait
Tehat a fenti script azt csinalja, hogy elinditja az 1. feladatot forkkal (dojob_1 &), majd megvarja, hogy az befejezodjon (wait). Ezutan folytatja a tobbi job vegrehajtasaval.
Ha CTRL+C-t nyomsz egy feladat vegrehajtasa kozben, akkor az atdefinialt "trap" direktiva azt csinalja, hogy megvarja az eppen futo feladat befejezeset, majd kilep a scriptbol.
Nekem is kellett mar erre a problemara megoldas, hirtelenjeben ezt talaltam ki, es mukodik is ;)
Köszönöm, ez működik!
-
ex glacies
Nem értem a pontos problémádat. Vagy az emlegetett
trapkell neked, vagy valami ilyesmi:while ! read -t 0.01 -N1 A do sleep 1 let i++ echo $i $A done echo $A