üdv,
egyszer már közzétettem itt egy általam írt scriptemet, na ez gyakorlatilag ugyanaz, csak valamivel értelmesebbé alakítottam. Az lenne a kérésem, hogy ha van aki ráér, kukkantsa már meg, és esetleg írjon javaslatokat, ötleteket és véleményeket. Oltani is lehet nyugodtan, habár tudom anélkül is, hogy gyakorlatilag egy nagy rakás szemét a munkám. viszont MŰKÖDIK! És nekem igazából az a fontos. A javaslatokra a további fejlesztésekhez lenne szükségem és hogy fejlődjek bash-ben :)
Előre is köszi.
- 1507 megtekintés
Hozzászólások
Hiányoznak az alapvető fájl meglét vizsgálatok!
Például szó nélkül próbálod include-olni (pl. ". config.txt" nem is egyszer), de mi van akkor ha maga a fájl nem létezik?
A meghívandó binárisok nem abszolút útvonallal vannak meghívva. Ez addig nem gond, amíg valakinek pl. a mysqldump benne van a PATH-ba. De amint nincs... :)
Optimalizálhatsz. Figyelj a "-p" kapcsolóra!
-if test -d $BP ; then
- echo
-else
- mkdir $BP
-fi
+[ ! -d $BP ] && mkdir -p $BP
Javaslatok:
- Az alábbi sort célszerű minden olyan shell scriptben használni ahol "rm -rf" van. 'set -o nounset
'
- Ismerkedj meg a $?
shell változóval.
- Ha csak azért írsz ki kettő vagy több echo-t, hogy sort emelj, sokkal egyszerűbb helyette az alábbi használata 'echo -e "\n"
' Például a 685. sortól kezdve.
- Az alábbi kódot változatlan formában többször is bekéred 'if [[ $QN = "y" || $QN = "Y" || $QN = "" ]] ; then
'. Erre nyugodtan írhatsz függvényt, illetve mi van akkor ha nem olyan értéket adok meg neki amit vár? Abort? Retry? Ignore? Fail?
- 'rm $BP"alldb_list_fix.txt"
' ismételten mi van akkor ha ez a fájl nem létezik?
- 'while : # Loop forever
' komoly? loop forever? :D
Szerk
Ha tényleg jól akarod csinálni, akkor itt nézelődj szét: http://www.bash-hackers.org/wiki/doku.php
Ne add fel! :)
--
\\-- blog --//
- A hozzászóláshoz be kell jelentkezni
köszi :) javítani fogom és ügyelni fogok azokra amiket írtál.
"rm -rf"-et nem használok, így véletlenül sem törlöm le az egész szerver tartalmát, ha gyökéren futtatom a scriptet és esetleg nem létezne a fájl :D Egyébként az az alldb_list_fix.txt kell hogy létezzen, mivel előtte egy sorral hozza létre magának ha tudja :)
y és n-nél valóban gázos ha nem azt adom amit vár, végülis akkor gyakorlatilag automatikusan n-nek veszi. Szóval ebből sem nagyon van baj.
optimalizálásnál hol van gáz a "-p" kapcsolóval?
ja és igen, Loop forever :D (még mikor tanulgattam a bash-t, akkor nézegettem, hogy hogy lehet megoldani ezt a gombnyomásos menüs rendszert, aztán bennehagytam azt a kommentet, mert vicces :) )
- A hozzászóláshoz be kell jelentkezni
Bash menürendszer létrehozására használhatod a select parancsot.
Nem muszáj az rm-nek az -rf kapcsoló ahhoz, hogy olyat töröljön le amit nem kellene. Például mi van akkor ha az alábbi script nem kap parancssori paramétert?
Hol és mit fog törölni?
#!/bin/bash
konyvtar=$1
rm $konyvtar/*.ods
Ha megadod a "set -o nounset" kapcsolót, akkor a bash nem fogja hagyni, hogy inicializálatlan változókat használj! Így rögtön nem fogsz rossz helyen törölni, mivel a script futása még azelőtt megszakad. Ez lehel elvárt működés is, meg nem is.
Szerk:
Az mkdir "-p" kapcsolója arra való, hogy ha több mélységben akarsz létrehozni könyvtárakat és ha valamelyik szülő könyvtár nem létezik, akkor azokat is létrehozza. Ellenkező esetben hibát dobna.
Tényleg ajánlom figyelmedbe a '$?' megismerését és használatát.
--
\\-- blog --//
- A hozzászóláshoz be kell jelentkezni
a scriptnek nincs szüksége kapcsolóra, azt már csak most raktam bele a legújabb verzióba, mármint a lehetőséget kapcsoló használatára. Csak 1-2 "gyorslink" hogy úgymondjam. :)
"rm" önmagában nem csinál semmit csak hibát dob:
rm: missing operand
ilyen csak ritkán nem várt helyzetekben fordul elő a script használatakor egyébként. van ahol beleírtam fájl törlését pl, amit nem ellenőriztetek, hogy létezik e, mert nem volt kedvem :D szóval ha nem létezik is ráírja az rm-et. De ez is max csak egy csúnya "No such file or directory" hibát eredményez, ami nem is észrevehető, mivel csomó helyen használtam "clear" parancsot a "Loop Forever"-ök miatt :D :)
Végülis azt hiszem, ahhoz képest, hogy ez az első dolog amit életemben írtam, nem olyan gáz. Bár az is igaz hogy már talán 2 éve dolgozom ezen, persze ezt nem úgy kell elképzelni hogy minden nap. Csak mikor eszembejutott. Összesen kb csak 2 hetet dolgoztam rajta. Azért olyan gagyi néhány helyen, mert a tudásom ennyit engedett. Multkor itt nagyon leoltottak, mert hihetetlen viccesen rosszul volt megírva az egész. Több fájlban, stb. Szánalmas volt így visszagondolva. De azóta kicsit fejlődtem. És próbáltam mindent a legjobb tudásom szerint leegyszerűsíteni, minél kevesebb sorba. Többé kevésbé sikerült is :) (és a lényeg: MŰKÖDIK!)
- A hozzászóláshoz be kell jelentkezni
Nem muszáj az rm-nek az -rf kapcsoló ahhoz, hogy olyat töröljön le amit nem kellene. Például mi van akkor ha az alábbi script nem kap parancssori paramétert?
Hol és mit fog törölni?
#!/bin/bash
konyvtar=$1
rm $konyvtar/*.ods
......
"rm" önmagában nem csinál semmit csak hibát dob:
rm: missing operand
akkor próbáld ki a fenti kódrészletet úgy, hogy a scriptet a "/ " paraméterrel hívod meg. aztán gondolkodj el azon, hogy mi történt volna, ha a "-rf / " paraméter kipróbálását javaslom.
mottónk: "-hogyan kell a .rm fájlokat lejátszani? -hát az rm paranccsal!"
ami nem is észrevehető, mivel csomó helyen használtam "clear" parancsot
ez nagyon tetszik! :)
ha sikerül elbaszni valamit, akkor még véletlenül se legyen esélyed rekonstruálni, hogy hol rontottad el...
- A hozzászóláshoz be kell jelentkezni
képzeld ha olyan hiba van, akkor leáll és nem fogja leclearelni. Mert syntax errornál alapból leáll ugye. És szépen tudom javítani a hibát.
az rm dologról annyit, hogy a scriptemben sehol nincs olyan írva, ahol rossz paramétert kaphatna. Ugyanis sehol sem a felhasználó adja a paramétert. A scriptben törlés csak előre megírva van, és konkrét fájlokra. Tehát abból nem hiszem hogy gondom lehet.
szerk: Na tehát megértettem az rm parancs veszélyeit, de nincs olyan írva, hogy nem kap paramétert na :) Tehát még véletlenül sincs. Direkt ügyeltem ilyenekre előrelátóan.
az előbb itt zagybáltam az előző hsz-ben mert nem fogtam fel hirtelen azt az rm-es scriptet, csak most esett le hogy ott van benne a $1 ami a paramétert várja. Nade a lényeg az hogy tutirabiztos hogy nincs sehol olyan amivel megszívhathatnám magam. Mert mint mondtam, csak konkrét fájlokra van írva rm. rm -rf meg egyáltalán sehol sincs!
- A hozzászóláshoz be kell jelentkezni
Tutira biztos?
Valahol hallottam már, hogy a 640KB mindenre elég!
Egyszer kell csak megszívni, onnantól kezdve kétszer is meggondolja az ember, hogy mennyire figyeljen oda az ilyen hülyebiztos funkciókra. Jobb fejben tartani és figylni az ilyenekre.
Te kértél tanácsot, én csak "adtam" :)
--
\\-- blog --//
- A hozzászóláshoz be kell jelentkezni
tudom, és sokat segítettél, szóval nagyon szépen köszönöm :) Azt a sort egyébként elég beírnom a script legelejére egy sorba úgy ahogy írtad?
szerk: ráadásul ettől még ha a cfg-ben valaki barom módon "-rf /"-re ír át egy olyan változót amire rm van, ugyanúgy törli az egész gépet. A másik, hogy a nounsettel egyből hibám van, mivel írtam kapcsolóra lehetőséget, de kapcsoló nélkül nem a help jön be, hanem maga a script. Mert a kapcsolókra csak úgymond "gyorslinkeket" írtam. Szóval ez a nounset nem nyert. És egyébként sincs szükség rá.
De esküszöm írni fogok hogy mekkora barom vagyok, ha sikerül letörölnöm az egész gépem majd vele véletlenül...
- A hozzászóláshoz be kell jelentkezni
Azt vetted hogy a: script.sh " -rf /" kapcsolóval lazán rm -rf / lesz a végeredmény? Ezt bőven lehet ragozni, mert tetszőleges könyvtár mélység mondható neki.
A szintax error vs. leállt gondold át, hogy milyen szintax erroror is van szó, sőt...
- A hozzászóláshoz be kell jelentkezni
ezt nem értem, de biztos igazad van :)
ha jól sejtem te erre az elrettentő példára írtad ezt. A scriptemben nincs rm után $1 szóval nem fogja a kapcsolót használni semmire. Csak konkrét létező (vagy tán nem létező, de mégis konkrét) dolgokra van írva rm a scriptben és csak is kapcsoló nélkül. Ezért vagyok annyira biztos, hogy nem lehet semmi nagyon váratlan :D
- A hozzászóláshoz be kell jelentkezni
Csak konkrét létező (vagy tán nem létező, de mégis konkrét) dolgokra van írva rm a scriptben és csak is kapcsoló nélkül.
config.txt:BP="/home/backups/"
tools.sh:rm $BP"alldb_list_fix.txt"
átírom a config.txt-t arra, hogy BP="-rf / "
és a tools.sh letörli az egész gépedet.
mi itt tépjük a szánkat, te meg csak pont a lényeget nem érted. komolyan nem értem, hogy akkor minek is nyitottad a topikot...
- A hozzászóláshoz be kell jelentkezni
hát ha vagy olyan idióta barom, hogy direkt -rf /-re írod át akkor megérdemled, hogy letöröld az egész gépedet...
- A hozzászóláshoz be kell jelentkezni