Bash script, elágazás (if) probléma, következetlen viselkedés. Mi a gond?
Adott a következő rendszer:
Ha egy bizonyos mappa valamelyik almappájában bármelyik fájl megváltozik, akkor el kell végezni valamilyen műveletet:
- Ha a megváltozott fájl a "common" nevű almappában van, akkor le kell futtatni az "egyik.sh" scriptet.
- Ha a megváltozott fájl nem a "common" nevű almappában van, akkor le kell futtatni a "masik.sh" scriptet, átadva neki a megváltozott fájl szülőmappájának nevét.
A fájl változást figyeli egy inotify-ra épített progi, azzal így önmagában úgy tűnik nincs is gond. Ha megváltozik a fájl, akkor meghívja a következőt:
/automatizalas/automation.sh change %f
Ahol %f a megváltozott fájl neve a teljes útvonallal.
Az automation.sh tartalmának lényegi része:
#!/bin/bash
# …
LOGFILE=/automatizalas/naplo.log
echo "----- Automatizálás script indul -----" >> ${LOGFILE}
echo "A következő fájl megváltozott:" >> ${LOGFILE}
echo $2 >> ${LOGFILE}
DIR=`dirname $2`
SHORTDIR=`basename $`
echo "A SHORTDIR értéke felkiáltójelek között:" >> ${LOGFILE}
echo !${SHORTDIR}! >> ${LOGFILE}
if [ "${SHORTDIR}" == "common" ]
then
echo "Ez a common mappa." >> ${LOGFILE}
egyik.sh
else
echo "Ez NEM a common mappa." >> ${LOGFILE}
masik.sh ${SHORTDIR}
fi
echo "----- Automatizálás script vége -----" >> ${LOGFILE}
#…
1. Törlöm a logfájl teljes tartalmát.
2. Megváltoztatom a /utvonal/a/figyelt/mappahoz/common/valtozik.txt fájlt. (Nyilván egyszer lefut a script.)
3. Beírom a terminálba, hogy:
/automatizalas/automation.sh change /utvonal/a/figyelt/mappahoz/common/valtozik.txt
A logfájl (/automatizalas/naplo.log) tartalma:
----- Automatizálás script indul -----
A következő fájl megváltozott:
/utvonal/a/figyelt/mappahoz/common/valtozik.txt
A SHORTDIR értéke felkiáltójelek között:
!common!
Ez NEM a common mappa.
----- Automatizálás script vége -----
----- Automatizálás script indul -----
A következő fájl megváltozott:
/utvonal/a/figyelt/mappahoz/common/valtozik.txt
A SHORTDIR értéke felkiáltójelek között:
!common!
Ez a common mappa.
----- Automatizálás script vége -----
~ ~ ~ ~ ~ ~ ~
És itt a furcsaság:
1. Ha az inotify váltja ki a script futását, akkor a $2 paraméter az, ami. A változó kiírása felkiáltójelek között is az, ami, viszont nem várt módon az összehasonlításnál (if) az else ágra lép.
2. Ha ugyanezt terminálból hívom meg, ugyanazokkal a paraméterekkel, akkor is ugyanaz a $2 paraméter, ugyanazt írja a logban, hogy !common!, viszont így elvárt módon az then ágba lép az összehasonlításnál.
~ ~ ~ ~ ~ ~ ~
A kérdés: Mi a pék?
Hosszabban: Ha ugyanazok a script bemeneti paraméterei, a log alapján is úgy tűnik ugyanaz a vizsgált változó értéke, ami nem kézzel lett beadva, hanem egy létező fájl teljes útvonalából lett kiollózva, így még félreírás sem lehet – és megnézve hex editorral, nincs ott semmi rejtett karakter –, akkor miért fut az egyik esetben az elágazás az else ágra, és miért fut terminálból meghívva az then ágra? Mit nem értek?
~ ~ ~ ~ ~ ~ ~
Megjegyzések:
1. Nem, nincs még egy eldugott példány más mappában az automation.sh-ból, valóban ugyanazt a scriptet hívta meg az inotify is, meg én is a terminálból.
2. Az útvonalban nincsenek speciális karakterek – de még nagybetű, vagy szám sem –, a teljes útvonal minden könyvtárának, fájljának neve [a-z.]*
3. Igen, kell az első paraméter, a script kissé összetettebb, az első paraméter alapján elágazik, amit nem másoltam be. Viszont az idézett kódrészlet az, ami. Nincsenek közbenső, kihagyott sorok, amik esetleg megváltoztathatnák a vizsgált változó értékét. Nincs más ágban sem hasonló kódrészlet, tehát biztos ugyanarról az elágazásról beszélünk.
Hmm…
Javítás:
SHORTDIR=`basename ${DIR}`
Ha valakinek így szebb:
pastebin (pont) com (per) 9G1TinsQ
Aham! Köszi!
(Közben megoldottam máshogy, bizonyos szempontból számomra rugalmasabb módon, de akkor ezt megjegyeztünk. Bár akkor is érdekes a kérdés, hogy miért fut következetesen az egyik meghívási mód az then, a másik az else ágra, mert ha ez a == egy bug, akkor valahol azt várná az ember, hogy következetesen csinálja ugyanazt a nem várt működést.)
#3
if-ben dupla legyenlőség kell. Simát csak akkor használunk, ha a egy változót deklarálunk benne és dolgozni szeretnénk még benne.
if(1 == 1) //igaz lesz a feltétel
if($bool = (1 == 1)) //eltesszük az eredményt {1 vagy true}
Hülyeséget légyszives ne írj a kérdezőnek.
#5: Nem PHP-ről, sem nem Javascriptről van szó, hanem bash scriptről. Bash script esetén amit írsz, az ezer sebből vérzik.
#6: Köszi.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!