Kernel készítő készítés

 ( PP | 2017. március 27., hétfő - 10:08 )

Sziasztok !

Szeretném továbbfejleszteni a kernel forgató kis scrip-et. Az első változat jól működik, csak szeretnék kicsit "többet tudóvá" tenni. Egész pontosan a menüvel vagyok elakadva. Ez itt a menü része a script-ből https://pastebin.com/1EWk6Mth

Azt szeretném, ha elvégezte a letöltést akkor térjen vissza a menümbe. Jelenleg a letöltés után kilép a programból. Hogyan tudnék olyan menüt készíteni, ahol egy feladat elvégzése után nem lép ki a programból? Csak akkor ha én szeretném.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Ha jól értem a problémát, akkor neked egy végtelen ciklus kell.


while true
do
# IDE JÖN A KÓDOD
done

Ha csak a while-ból akarsz kilépni (és nem a szkriptből), akkor az exit 0 helyett a break utasítást használd.

Probáltam de ezzel az a baj, hogy letöltés után újra és újra elkezdi. Ha bedobok a végére a "break" -et akkor csak egyszer hajtja végre a letöltést. De úgyebár ki is lép teljesen.
Azt szeretném elérni, hogy ha végbe ment az utasítás maradjon a menübe és várja a következő utasítást. Csak akkor lépjen ki a programból, ha a "6"-ost megnyomom. Ezért adtam meg a "6"-nak az exit 0 -t

Egy lehetséges megoldás, hogy a menüd legyen a while cikluson belül, az egyes menüpontokhoz tartozó feladatokat meg rakd ki függvényekbe.
Amikor megkapod az inputot, elágazol annak megfelelően, hogy mit kaptál, ha "6-ost" akkor meg exitelsz.
a Te megoldásod is belerakható, így: http://paste2.org/xCeAkO4t

Pontosan erre gondoltam én is az első kommentemben. :-)

Igazad van. Ott rontottam el, hogy lejeb raktam. Most már működik.

Köszönöm a segítséget.

A break-et csak a 6-oshoz gondoltam...

Szerk: ha már menüt bütykölsz, nézz rá a "dialog" parancsra.

Meg bash-ben van olyan is, hogy select.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Mindig tanul az ember.

Hát bizony! Én a figletről nem hallottam, s nézem, van Fedorához is.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A másik elég vad dolog az asciio, de ez berántja a fél Perl univerzumot. Viszont GUI felületen lehet vele Ascii diagramokat készíteni. Kb. 10 éve használta az egyik exkollega, amikor még főleg plain text dokumentációk voltak.

Egyszerűbb diagramokhoz meg ott a Vim alá elérhető DrawIt.

Nem szeretnék plusz programot használni ezért nem dialog-al csinálom a menüt. Ezért is használom a letöltéshez a "curl"-t és nem a kedvencemet a wget-et. Kicsit módosítanom kell a menümet, mert "sub menü" szerűségre van szükségem.

A curl is plusz program...

+1

A kernel make menuconfig-ja nem a dialog-ot használja?

A wgetet ugy tapasztaltam, tobb helyre felteszik alapbol (nekem a curl a kedvencem).

--
A strange game. The only winning move is not to play. How about a nice game of chess? - Wargames

De a legmenőbb az, ha egy környezeti változóból (vagy paraméterből) szedi a letöltőprogram parancsát (és persze egy default értékre beáll, ha nincs megadva).

Vagy megvizsgálja, melyik van telepítve, és azt használja.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ó, ez tényleg menőbb :)
Persze ehhez meg kell egy lista, hogy miket nézzen meg :D

Van egy scriptem, amiben csinálom ezt, de nem teljes értékűen, csak ímmel-ámmal. Néha a Fedora build szerverről frissítek egyes csomagokat egy erre a célra általam írt scripttel, nem várom meg, amíg megjelenik repóban. A letöltést aria2-vel végzem, mert ez tud több szálon tölteni. Ha viszont nincs fenn az aria2, akkor fallback wget-re. A curl-t már nem nézem, nálam a wget mindig telepítve van. Azt sem nézem egy bash scriptben, hogy van-e bash. ;)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Idézet:
Azt sem nézem egy bash scriptben, hogy van-e bash. ;)

Te ugyan nem nezed, de a szkripted elejen levo #!/bin/bash hatasara a kernel biza megnezi :-)

Félreértesz. Persze, hogy a script megmondja, mi legyen az interpreter. De nem dinamikusan mondja meg, hogy ha nincs bash, legyen dash, ash, ksh, csh, vagy akármi. Nem szoktam hordozható scriptet írni. Azért vannak a bash feature-ei, hogy használjam őket, szóval zokszó nélkül írok process helyettesítést, dupla zárójelek között C-stílusban ++-szal inkrementálást, meg egyéb szörnyűségeket. :)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Idézet:
Nem szoktam hordozható scriptet írni

Nincsen azzal semmi baj, amig eloirod, hogy neked marpedig bash kell. A problema akkor jelentkezik, ha #!/bin/sh-t irsz, es megis bash-specifikus dolgokat hasznalsz.

Azért ennyire lökött nem vagyok! :D Természetesen előírom neki, hogy bash legyen az interpreter.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Akkor nyugodtan alhatsz :-)

(hacsak nem lesz egy ujabb inkompatibilis valtoztatas, lasd peldaul a bash compat31, compat32, compat40, compat41, compat42 opcioit... ;-)

Idézet:
a kernel biza megnezi

Biztos a kernel?

Azt látom, az execve() az unistd.h-ban van. Akkor talán glibc?

Szerk.: de különben syscall lesz belőle szerintem valóban.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Akkor kernel. Bár szerintem továbbra is igaz, hogy glibc-n keresztül.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Azontúl, hogy a glibc-ben vannak ügyes wrapperek a clone() rendszerhívás fölé (fork, vfork, stb) valamint az execet megvalósító fölé, a libc nem csinál többet. strace-eltél már valaha?

Öhh... Azt hiszem, új dolog tanulása van folyamatban.
Úgy gondoltam, hogy az adott shell (vagy valami), amiben kiadjuk a parancsot, az nézi meg, melyik paranccsal (shellel) töltse be és futtassa a fájlt. Viszont úgy látom, hogy az execve nézi a shebang-ot a fájl elején.
Na, ha másért nem, legalább ezért a plusz infóért megérte beleszólnom, még ha nem is volt igazam :)

Ha a shell csinálná, bajban volnál, nem lenne transzparens a dolog: nem tudnád bárhonnan ugyanúgy futtatni, mint egy binárist (vagy minden shellben/egyéb programban implementálnod kell). A libc már logikusabb lenne, de abból is van egy rakat, illetve senki se tart vissza, hogy közvetlen syscallt hívj - megint törött rendszert eredményez.

Így kerül shebang line parsolás a kernelbe.

Bevallom, sose gondolkodtam rajta, hogy kin megy keresztül és ki állítja össze a futtatást. Jó pap is holtig tanul :)

dialog-ra +1

Még egy kis segítséget szeretnék kérni. Szeretném ha az egyik echo-val kiírt kimenetem villogna. Azt tudom, hogy így kell megadni "echo -e "\e[5m ...." de valami miatt nem csinálja azt amit szeretnék. Az aláhúzás és a vastagítás működik a színekkel együtt. Egyedül ezt az egy nem.

Másik kérdésem, Szeretnék egy kimenetet nem sima betűvel, hanem vonalakkal kinyíratni. Ha jól tudom van egy program amivel ez lehetséges. Esetleg megtudná mondani valaki melyik ez a program?

Nekem sem villog, csak színeződik. Esetleg villogtasd magad:

while :; do echo -ne '\rflash'; sleep 0.5; echo -ne '\r     '; sleep 0.5; done

Mit akarsz kinyíratni? Nagyban akarsz kiírni szöveget például 'x' karakterekkel? Programozd le! :)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nem akarok semmit "kinyíratni" csak elírtam. Sorry
Kiíratni akart lenni :)
A program amit kerestem azt tényleg a figlet.

Köszönöm a segítséget.

A villogást nem mindent terminál támogatja:
- gnome-terminal-ban nem villog
- xterm-ben igen (de csak akkor ha aktív az ablak)

A vonalas kérdésedre pedig szerintem a figlet parancs/csomag lesz a válasz.

Szeretnék még egy kis segítséget kérni. A következőbe akadtam meg. Kilistáztam az összes kernel verzió-t ami megtalálható a "/usr/src"-ben. A menüben szeretném ezt megjeleníteni úgy; hogy minden verzióhoz tartozón egy szám. Ha megadok neki egy számot azok közül ami megjelenik, szeretném ha csinálna egy linket a "linux" mappához. Szóval dinamikus menü szeretnék.

sub menüvel próbálkoztam ami addig jó, hogy átlép a másik menübe, csak fogalmam sincs hogyan tudom kivitelezni hogy folyamatosan változzon a menübe az adat.

Mi az, hogy folyamatosan változzon a menüben az adat? Rajta állsz a menün, kiírja a létező kernel verziókat, majd alátolsz egy újabb alkönyvtárat, s a terminálon kerüljön a listába úgy, hogy nem nyúltál közben billentyűzethez?


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nem.

Ha az "/usr/src" könyvtárba bővül vagy kevesebb adat lesz mint jelenleg az alapján változzon meg a menü. PL: Jelenleg így néz ki az az említett könyvtár.

pusztito@Warrior ~ $ ls /usr/src/ | grep "linux-"
linux-4.10.1
linux-4.10.2
linux-4.10.4
linux-4.10.5
pusztito@Warrior ~ $

Menünek így kéne kinéznie a jelenlegi könyvtár adatok alapján.

1 -> linux-4.10.1
2 -> linux-4.10.2
3 -> linux-4.10.4
4 -> linux-4.10.5

Ha mondjuk megnyomom a "2"-t akkor a következőt kéne lefutnia "ln -sf linux-4.10.2 linux" ha mondjuk a "4"-t nyomom meg akkor "ln -sf linux-4.10.5 linux". Ez ilyen formába egyszerű lenne, a csavar viszont az, ha letöltöm mondjuk a jelenlegi legújabb kernelt "linux-4.10.6" akkor úgyebár bővül a lista.

1 -> linux-4.10.1
2 -> linux-4.10.2
3 -> linux-4.10.4
4 -> linux-4.10.5
5 -> linux-4.10.6

Azt szeretném hogy ne kelljen mindig belenyúlni a script-be, hanem automatikusan csinálja meg, úgy hogy ha megnyomom az "5" akkor futtassa le a "ln -sf linux-4.10.6 linux" parancsot. Ha esetleg törlésre kerül az egyik kernel forrás pl "3"-as akkor is módosuljon.

1 -> linux-4.10.1
2 -> linux-4.10.2
3 -> linux-4.10.5
4 -> linux-4.10.6

Így ha a "4"-et nyomom meg akkor linkelje át a linux-4.10.6 -ot.

Tömbbe mentsd le a mappalistádat mindig, amikor belépsz a menübe. (Mondjuk 0-tól kezdi a számozást, de ez van.) Így ha nyomsz egy számot, akkor a tömbből elő tudja húzni, hogy melyik elemet kellene linkelni. A tömböt (index és érték) ki tudod írni egy egyszerű for/while hívással.

Ja, de hát ez könnyű! :) Az fel sem vetődött bennem, hogy a scriptbe drótoznád a listát. Érdemes észrevenni, hogy a bash-nek éppen a helyettesítés az erőssége. Bármit bárhova helyettesíthetsz, így ahol statikusan adnád meg a listát, oda lehet standard output-ot is helyettesíteni. Vagy process substitution. Vagy pipe. Vagy array. Lehetőséged, mint csillag az égen.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Őszintén szólva, fogalmam sincs hogyan álljak neki.

Vázlat, kipróbálás nélkül:

cd /usr/src
i=1
while read; do
    [ -d "$REPLY" ] || continue
    lista[i]="$REPLY"
    echo "$i. $REPLY"
    ((i++))
done < <(ls -1)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

find /usr/src -type d -maxdepth 1 -name linux-\* | sed 's,^.*linux-,,' | sort -V | cat -n

Akár, bár a sorszámtól eltekintve szinte ez az ls -1, de a célom az volt, hogy egy tömbben ott legyen, ami kell, hogy menüt faraghasson belőle. A echo-t nem is tudom, miért írtam bele. Azért, hogy ki tudja próbálni. Igazából az egész szerves része a menünek, szóval nagyon sok féle megoldás szóba kerülhet.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nagyon tömb sem kell, mert simán szóközökkel elválasztható szövegek ezek (amelyek nem tartalmaznak szóközt). És ha már nincs tömb, akkor már egész hordozható a kód is :)

Csak kérdezem, a tömb miben zárja ki a hordozhatóságot?
--------------
„If there were no hell, we would be like the animals. No hell, no dignity.”

Nem minden shell támogatja a tömböket, pl. (ha linux-vonalon maradunk) a dash sem. Itt ilyesmit írnak:

Idézet:
Array variables are not portable. With some care about suitable separators they can typically be replaced with a series of ${foo#bar} expansions and the like without noticeably affecting performance.

illetve

Idézet:
Here's another example that may be needed when dealing with these bashisms on arrays.

Hmm… Nem tudtam. Köszi :)

--------------
„If there were no hell, we would be like the animals. No hell, no dignity.”

Szívesen máskor is :)

Visszagondolva a LEDE router-emre írt egyik scriptemre, nekem úgy tűnt, hogy ash-ban nincsenek tömbök. Van viszont eval, így lehet ilyet csinálni:

eval echo \$tomb_$index

Az elemek pedig tomb_0, tomb_1, stb.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ne találd fel újra a Gentoo-t, inkább használd! (eselect kernel)
------------------------
{0} ok boto
boto ?

Ebbe van valami. Lehet, inkább ki kéne hagyni az átlinkelést. Inkább maradni az eredeti forrásnál.

Félreértesz. A Gentoo 'eselect' nevű eszközének 'kernel' nevű modulja éppen ezt valósítja meg, amit fentebb vázoltál.
------------------------
{0} ok boto
boto ?

Igen tudom. Nemrég visszatértem LFS linuxról funtoo-ra. Régi nagy kedvencemhez. Azért nem használom fel az "eselect"-t mert szeretnék ha distro független lenne. Talán késgöbiekbe visszatérek az LFS-hez.

Sziasztok.

Egy kis tanácsot szeretnék kérni. Programom leellenőrzi, hogy csatolva van e a "/boot" partíció és ha nem akkor csatolja. Ezzel nincs is gond. Arra lennék kíváncsi, melyik megoldást tartjátok jobbnak. Ha a partíciót az "fstab"-ból olvasom ki vagy a "mount" parancsot szerkesztem meg. Nem tudom miért, de eddig mindkettőt használtam és csak most tűnt fel. :D Gondoltam, egységessé teszem.

Kérdés, hogy mi a célod vele: csak most akarod csatolni, vagy mától kezdve mindig...

Mától kezdve mindig, amikor a programom elindul, ill mindig amikor fut. Eddig úgy vettem észre, hogy mindkét variáció működő képes (Eddig nem vettem észre problémát). Szerintetek melyiket volna célszerűbb használni?

Az fstab-ban épp a kívánt paraméterekkel van, tehát arra hivatkoznék. Persze, ha ott esetleg ro, az szívás. Viszont, ha nincs felcsatolva a /boot, akkor honnan tudod, hogy melyik az, hacsak épp nem az fstab-ból?

Egyébként én a gép elindulását követően nem szoktam lecsatolni a /boot-ot.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Jogos. Ha nincs felcsatolva, akkor csak az fstab-ból tudhatom meg a paramétereket. Igazad van. Ha mondjuk, a "/" könyvtárra is kíváncsi vagyok, akkor arra használhatom a "mount" parancsot.

Grub-al kapcsolatba is volna egy kérdésem. A grub konfig létrehozására a következő parancsot használom. "grub-mkconfig -o /boot/grub/grub.cfg" Arra lennénék kíváncsi, hogy a "grub-install" parancsot is mindig le kell futtatni minden "grub-mkconfig" futtatás után? Ha igen, milyen sorrendbe?

Nem kell lefuttatni, hiszen az MBR-ben és az első partíció előtt már ott a Grub. Hivatalosan ugyan beleírják commentbe, hogy ne szerkezd a grub.cfg-t, de nyugodtan hozzányúlhatsz. Két ok miatt van ott, hogy do not edit:

1) Ha elszúrod, nem boot-ol a gép, csak egy live Linuxról tudod helyrehozni, ami nyűgös
2) A változtatás nem marad meg abban az értelemben, hogy a grub-mkconfig felülírja, hiszen épp ő állítja elő a grub.cfg-t. Viszont ez csak akkor probléma, ha használod a grub-mkconfig parancsot.

Én nem szoktam, mert Fedora - ezt a disztribúciót használom - kernel frissítéskor a grub.cfg-t editálja, a kernel paramétereket, az fs uuid-eket átveszi az aktuálisan futó kernel bejegyzéséből. Mivel sohasem használom a grub-mkconfig parancsot, továbbá biztos vagyok magamban, nekem kényelmesebb közvetlenül a grub.cfg szerkesztése.

Ha annyira elbénázok valamit, hogy kell az autodetect, akkor inkább úgy használom a grub-mkconfig parancsot, hogy egy ideiglenes file-t generáltatok vele, például grub.cfg.temp néven, s megnézem, mit alakított, s az értelmes részeket manuálisan szerkesztem a grub.cfg-be.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

mount /boot oszt kész.

Ha nincs mountolva, felmountolja, amúgy marad békén.
Utána mount /boot -o remount,és

De ezek teljesen jól dokumentált alap dolgok. Te csinálod, vagy mi? (A szokásos kérdésem.)

+1

Mi az, hogy és? Nem rw akart az lenni? ;)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Autocorrect, yep.

Zsír! :DD


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

"De ezek teljesen jól dokumentált alap dolgok. Te csinálod, vagy mi? "
Ezt a kérdésed, nem igazán értem. Egy kernel build script-et írok. Ezt a "mount /boot" módszert nem ismertem bevallom őszintén. Mindig "mount -t ext2 /dev/xxx /boot" -ot használtam. Néha kihagyom a filerendszer típusát az igaz.

Ez a baj. Azt se tudod, mit csinál.

Olvastad már a man pageét, vagy valami?

Ha nem adod meg, hogy mit hova, hanem csak a mit, vagy csak a hovát, s az szerepel az fstab-ban, akkor onnan szedi a hiányzó infót. Aztán van olyan is, hogy

mount -a

Ami végiggyalogol az egész fstab-on, s ami nincs felcsatolva, azt felcsatolja.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Meggyőztetek. Egyszerűen "mount /boot"-ot használom. A script-et is módosítottam.

Nem kötözködöm, hanem konstruktív jelleggel jegyzem meg, hogy felesleges olyasvalamit automatizálni, amit nem ismersz és emiatt nem tudsz manuálisan érdemben, szabályosan, jól és dokumentált formában végigcsinálni. Nem sok esélyed van a sikerre, és az eredmény csak szerinted lesz használható. Ne kapkodj, ne csapongj, hanem gondolkozz és tanulj! Lassíts! Ne feltaláló akarj lenni, mielőtt technikustanonc lettél volna egyáltalán...!
------------------------
{0} ok boto
boto ?

Sziasztok !

Leteszteltem, a manuális és az automatikus kernel forgatást is. Nagyon jól működik. Már csak a grub configot kellene megoldani rendesen. Sajnos, a "grub-mkconfig -o /boot/grub/grub.cfg" nem a legjobb. Legalábbis, megcsinálja a configot de valami miatt csinál egy submenu-t és onnét lehet indítani a kerneleket. Müködik így is, csak mindig boot-nál át kell lépni. Megfordult a fejembe, hogy esetleg a funtoo boot updateja zavar be neki. Mivel lfs linux-ot mikor használtam, mindig így frissítettem a grub-ot. Előfordulhat, hogy tényleg ez zavar be neki?

Írtam róla fentebb. Teljesen mindegy, hogyan csinálod a grub.cfg-t, csak jó legyen. Az egy text file, egy script. A másik kritérium, hogy a disztribúció egy másik valamilye buzgalmában ne írja felül azt, amit csináltál.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

whiptail?
-------------------------
Dropbox refer - mert kell a hely: https://db.tt/V3RtXWLl
neut @ présház

Sziasztok !

Szeretnék egy flash-t belerakni, a kernel készítő scriptembe. Az egyik echo kimenetem szeretném, ha váltaná a színét, úgy hogy a program továbbra is folytatódjon. Ugyebár a "while" ciklussal meg tudom csinálni a flash-t, de a program többi elemét nem mutatja. Hogyan tudom azt megcsinálni, ne csak a flash működjön, hanem a program többi része is?

Úgy, hogy a villogtató programot másik processben futtatod:

parancs &

Lehet függvény is, de van subshell is, az meg a gömbölyű zárójel.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Írtam egy hevenyészett vázlatot a villogtatásra, működik, de így éjszaka már nem írom bele, hogy a menüt kiírja, az csak az első 'l' betű lenyomása után törtémik majd meg. A lefelé nyíl az 'l', a felfelé nyíl a 'p', kilépés pedig a 'q'. Pirosan villog az aktuális menüpont, amúgy meg az égvilágon semmire sem jó az egész. :) Az 'indeksz' nevű változóért bocsánat, de a HUP fórummotorja elnyeli ezt a szót normálisan leírva szögletes zárójelek között, ezért ez az idétlen név.

#!/bin/bash

menu=('alma' 'körte' 'szilva' 'kutya' 'hernyó' 'nyúl')
FLASH_TIME=0.5
posx=5

norm='\e[m'
lred='\e[31;1m'

blink() {
    while :; do
        echo -ne "\e[s$lred$1$norm"
        sleep "$2"
        echo -ne "\e[u$1"
        sleep "$2"
        echo -ne '\e[u'
    done
}

pid=0
spaces='                                      '
indeksz=0
while read -srN 1; do
    old=$indeksz
    [ "$REPLY" = 'p' ] && ((indeksz > 0 && indeksz--))
    [ "$REPLY" = 'l' ] && ((indeksz < ${#menu[@]}-1 && indeksz++))
    [ $indeksz -eq $old ] && [ "$REPLY" != 'q' ] && continue
    if [ $pid -gt 1 ]; then
        kill $pid
        wait $pid &>/dev/null
        [ $old -gt 0 ] && echo -ne "\e[${old}A"
        echo -ne '\r'
    fi
    for ((i=0; i<${#menu[@]}; i++)); do
        echo "${spaces:0:posx}${menu[i]}"
    done
    [ "$REPLY" = 'q' ] && break
    ((i=${#menu[@]}-indeksz))
    echo -ne "\e[${i}A\r"
    echo -n "${spaces:0:posx}"
    blink "${menu[indeksz]}" $FLASH_TIME &
    pid=$!
done
exit 0


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Köszönöm. Tetszik az ötlet. Lehet, később átalakítom a menümet. Most jelenleg, az egyik flesh megjelenésével kínlódok. Ebbe kérnék egy kis segítséget. Van egy "Flash" nevű fügvényem ahol az egyik változom értékét kellene megjeleníteni és villogtatni.

Fügvényem:

function Flash() {
while :
do
echo -ne '\r $SOURCEVER '
sleep 0.5
echo -ne '\r '
sleep 0.5
done
}

Azt szeretném ha itt jelene meg a Flash

echo -e "$Y Rendszer kernel verzió: $N $R linux-$SYSVER $N"
if [ "$linux-$SYSVER" != "$SOURCEVER" ]; then
echo -e "$Y Legújabb kernel verzió: $N"
Flash &
else
echo -e "$Y Legújabb elérhető verzió: $N $G Jelenleg nincs újabb verzió. :)$N"
fi

Hogyan tudnám elérni, azt hogy csak a "Legújabb elérhető verzió" után jelenjen meg a "Flash" ? Úgy hogy a a program többi részét is megjelenítse?

Nem fogom megoldani helyetted egyrészt azért, mert abból nem tanulsz, másrészt azért, mert az nekem is idő, viszont segítek olyan dolgokban, amelyeket egyből látok.

A function kulcsszót nem muszáj kiírni, bár lehet. Ezen felül szerencsésebb lehet, ha a függvénynek paramétert adsz át, s nem globális változót íratsz ki. Figyelj arra, hogy a háttérben futtatott függvény önálló process-ben fut, teljesen izolált memóriaterületen, egy másik shell futtatja. Becsapós, mert ebben a scriptben írtad le, de egy időben csak így tud egyszerre végrehajtódni a két kód. Ez azért is érdekes lehet, mert például a függvényed változóira semmilyen rálátása nem lesz az eredeti shellnek. A függvényed paraméterei $1, $2, $3, stb., épp úgy, ahogyan a shell-nek is át tudsz adni paramétereket.

Az aposztrof teljes elzárás a shell elől, tehát azon belül nem történik helyettesítés. Ha azt szeretnéd, hogy a változód helyettesítésre kerüljön, ha úgy tetszik, „kifejtődjön”, használj idézőjelet aposztrof helyett.

Miután háttérben indítottál egy függvényt, a $! segítségével kérdezd le annak process azonosítóját, ellenkező esetben nem találod meg többé, az mindig ott fog futkorászni a háttérben. Értelemszerűen előbb-utóbb ki kell majd nyírnot. Erre jó a kill parancs, amellyel például SIGTERM-et küldhetsz neki. Vigyázz, a kill csak elküldi a signal-t, de nem várja meg, amíg elpusztul a process, így a wait paranccsal tudod megvárni, amíg valóban meg is hal.

Figyelj arra, hogy noha független folyamatokat futtatsz párhuzamosan, ezek ugyanarra a terminálra írnak. Ha az egyik folyamat a kurzorpozíciót megváltoztatta, vagy ANSI szekvenciával a színeket módosította, akkor a másik folyamat erről nem fog tudni, amit kiír, az a megváltoztatott pozícióra és attribútummal történik majd, hiszen ezek a terminálnak szólnak, nem a process-ek állapotváltozói. Ha alaposabban megfigyeled, a programomban előbb megölöm a villogtató folyamatot, meg is várom, míg az elpusztul, s csak azt követően módosítom a kurzorpozíciót. Mivel nem tudom, hogy épp piros vagy fehér a felirat, amikor kinyírtam a blink() függvényt, az egész menüt kiírom normál színnel, elérve azt, hogy ne maradjon ott piros szöveg.

Az is fontos, hogy még ugyanaz az echo írja az attribútumokat normál színre, amelyik pirosra írta. Ha nem így lenne, ebből a szempontból nem lenne atomikus a függvény, előfordulhatna, hogy a kinyírásakor éppen piros marad a terminálon a beállítás. Azt is vedd észre, hogy van ott kurzorpozíció mentés és annak visszatöltése is. A posx az balról behúzás, hogy ne feltétlenül bal szélen kezdődjön a menü.

A wait sokat szövegel, összeszemetelné a terminált, így mind az stdout, mind az stderr megy a null device-ra. A felfelé kurzor mozgatás tapasztalatom szerint 0 értékkel is 1-et lép fel, hogy dögöljön meg :), ezért vizsgálom a változót, s csak nem 0 esetén mozgatom felfelé a kurzort a változó értékével. A másik hasonló esetben ez a vizsgálat nem kell, mert a változó sohasem lehet ott 0, mivel a kurzor a menü alatti sorban van, tehát legalább 1-gyel feljebb kell lépni.

Tegyük hozzá, egy kernel fordító script kiválasztó menüjébe teljesen felesleges a villogtatás, viszont rengeteget tanulsz, ha megcsinálod, mert ez látszólag egyszerű, valójában rengeteg buktatója van, amelyekről részben most beszéltem is.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

"Tegyük hozzá, egy kernel fordító script kiválasztó menüjébe teljesen felesleges a villogtatás,"

Igazad van. Ez csak "dizájn". Csak Jól mutatna, ha az egyik echo kimenet után villogva mutatná az egyik változó kimenetet. Már sikerült a függvénybe behelyettesíteni a változót úgy, hogy mutatja is. Már csak azt kell megoldanom, hogy rendesen a helyére kerüljön.

Láttad a mintámat, onnan tudsz puskázni. Meg némi magyarázatot is írtam hozzá. :)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Sziasztok!

Egy picike kis segítséget szeretnék kérni. Van egy echo kimenet ahol két adatott, jelenít meg annak a függvényébe, hogy a két adat megegyezi e. Ezt egy egyszerű if -el el lehet dönteni. Valami miatt mégse akarja megfelelően végrehajtani.

echo -e "$Y Rendszer kernel verzió: $N $R linux-$SYSVER $N"
if [ "$linux-$SYSVER" != "$SOURCEVER" ]; then
echo -en "$Y Legújabb kernel verzió: $N $G $SOURCEVER $N"
else
echo -e "$Y Legújabb elérhető verzió: $N $G Jelenleg nincs újabb verzió. :)$N"
fi

Valamiért, ha a két adat megegyezik akkor is a (echo -en "$Y Legújabb kernel verzió: $N $G $SOURCEVER $N") hajtódik végbe. Lemerem fogadni valami egyszerű a megoldás csak nem szúrja ki a szemem :)

Nem egyezik az meg, csak szeretnéd hinni. Lehet, hogy az egyikben van a végén egy felesleges szóköz, amit nem látsz, vagy valami hasonló. Úgy szoktam, hogy elé, mögé aposztrofot írok, s akkor látszik a debug:

echo -e "'$linux-$SYSVER'\t'$SOURCEVER'"

Ezt az if előtti sorba írd, s akkor látod majd a disznóságot.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Megvan a gond :D Egy plusz "$" miatt volt.