Régi tervem, hogy írok egy kis scriptet ami roppant rövid email -ket küld nekem, lokálisan (exim4 smart host). A levelek és a küldési időpont a crontab bejegyzéseihez hasonlítana, így valahogy:
* 03 07 08 * tovis@localhost "Tamás névnap" "Tamás barátom"
A mezők sorban: év,hó,nap,óra,perc,címzett,téma,tartalom
Ezek amolyan emlékeztetők lennének. Eddig jutottam:
check_stamp()
{
# itt kellene az időt ellenőríznem
}
grep -v '^#' $1 | while read ROW
do
check_stamp $ROW
done
A dolog jól is menne (a check_stamp $1=év $2=hó stb. megkapja) ha nem lennének a definícióban csillagok, ezeket a shell szépen behelyettesíti az adott könyvtárban lévő fájlok nevével :(
Persze használhatnék valami mást a csillag helyett - mondjuk '-' - de szeretném megőrizni a "konvenciókat". Van valami ötlet hogy lehetne rávenni a shell -t, hogy átmenetileg NE értelmezgesse az argumentumokat? Ha az egész sort ($ROW) idézőjelekbe teszem, akkor ott vagyok ahonnan indultam a check_stamp az egész sort megkapja, így épp semmi értelme. Talán mezőnként és awk? - jó hosszú lesz a script csak emiatt, nem túl "elegáns". Viszont minden csillagot = bármi, behelyettesíthetném az aktuális értékkel (év, hó, nap stb.).
Esetleg sed? - minden csillagot a sorban lecserélni. Talán még ez a legjobb. Tudtok valami más tippet?
- 6584 megtekintés
Hozzászólások
"$whatever" ?
- A hozzászóláshoz be kell jelentkezni
Bocs ezt nem ismerem, nem értem.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Szerintem arra próbál utalni, hogy $v helyett "$v" kéne. Ebben teljesen egyetértünk, bár nem jövök rá, hogy ez hol segít a problémán. Az tény, hogy a check_stamp hívása rossz, mert oda kell az idézőjel, de gondolom magában a check_stamp rutinban kellene korrekten hivatkozni az átadott paraméterekre. Mondjuk én inkább valahogy így csinálnám:
grep -v '^#' crontab | while read perc ora nap honap hetnapja parancs ; do
check_stamp "$perc" "$ora" "$nap" "$honap" "$hetnapja"
....
akarmi a $parancs felhasználásával
És persze a check_stamp-ban pontosan 5 paramétert fogsz kapni, és ha abban is "$1" (tehát idézőjeles) formában hivatkozol, akkor az nem lesz gond.
- A hozzászóláshoz be kell jelentkezni
Ami nem tiszta, hogy most akarsz egy új cront írni, vagy mi van?
- A hozzászóláshoz be kell jelentkezni
Van egy fájlod benne az adatok, dátum, esemény. A cronból futtatott script dátumot hasonlít és levelet küld ha kell. Nem látok csillagot a történetben!
Ill, nem kell neked csillag sehova! Minek?
c
- A hozzászóláshoz be kell jelentkezni
A terv az, hogy a script napjában 1 vagy néhányszor lefut és végignézi az akár 100 soros listát. Ennyi vacakot nem fogok soronként a cronba begépelgetni, minden alkalommal.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
??? Ahogyan a listádat legalább egyszer be kell gépelni, pontosan ugyanúgy kell egyszer a crontab-ba is begépelni. Hint: crontab -e
- A hozzászóláshoz be kell jelentkezni
"cronba begépelgetni, minden alkalommal"
Minden alkalommal??? Biztosan tudod, mi az a cron, és hogyan kezelhető?
- A hozzászóláshoz be kell jelentkezni
A "minden alkalommal" alatt azt értem, hogy amikor áttelepítem. Persze, lehet a crontab -ot egyben szerkeszteni, de akkor sem tartom szerencsésnek a crontabot ennyi mindennel telepakolni - jobb lenne ez így.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
ki tudod menteni a crontab tartalmát fájlba és utána vissza is tudod tölteni, akár áttelepítés után is, ha zavar hogy sok van benne akkor ha egy névnapot már elküldött akkor egy szkript ki is törölheti az adott sort a cronból, majd újévkor töltöd be az eredeti hossszú listát, így év vége felé soványodik a crontab. év elején megint betöltöd az eredetit névnap listát és kezded előröl.
Ez a megoldás év vége felé egész elegánsan mutat :D
szerk: közben látom, hogy már közel a megoldás :)
- A hozzászóláshoz be kell jelentkezni
Az az igazság, hogy amúgy is elég intenzíven használom a crontabot, nem szeretném összeszemetelni.
Sokkal szimpatikusabb, egy crontab bejegyzés a kis szerény felhasználói azonosítómmal, egy kis script és egy szép nagy text állomány a saját home -on belül.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Mindenesetre ha ilyet akarnék csinálni, nem textben tárolnám a feladatokat, hanem sqlite db-ben.
Miért?
Mert nagyon elegánsan lehetne a crontól kapott időszakos impulzusra (saját szlípelgetés helyett) selecttel leválogatni mindazon rekordokat, amelyek megfelelő időparaméterei megfelelnek (azonosak, v. csillagozottak) az aktuális impulzuséival.
1-2 célmező bevezetésével az alapértelmezett akció helyett akár szkriptsorokat is le lehet futtatni - azokat persze szintén a db-ben tárolva, h egyetlen fájl átmásolásával akárhol ott legyen a cronbancron.
Viszont nem akarok ilyet csinálni (de nem merem mondani, hogy soha nem hozhat ilyet a sorsom).
- A hozzászóláshoz be kell jelentkezni
Teljesen mértékben megértelek, csak arra reagáltam, hogy szépen meg lehet azt csinálni simán cronba is.
- A hozzászóláshoz be kell jelentkezni
A legegyszerűbb talán az, hogy a fájlban maradjon asterisk, a scripten belül viszont sed segítségével írd át valami másra, amit nem használsz, és nem is értelmeződik.
- A hozzászóláshoz be kell jelentkezni
#!/bin/bash
check_stamp(){
echo "check_stamp: '$1' '$2' '$3' '$4' '$5' '$6' '$7' '$8'"
}
(
egrep -v '^(#|\s*$)' $1 | while read ROW ; do
set -f
eval check_stamp $ROW
done
)<<END
* 03 07 08 * tovis@localhost "Tamás névnap" "Tamás barátom"
END
- A hozzászóláshoz be kell jelentkezni
A sed nyert!
check_stamp()
{
# itt kellene az időt ellenőríznem
}
grep -v '^#' $1 | sed 's/\*/any/g' | while read ROW
do
check_stamp $ROW
done
Minden csillagot lecseréli az "any" kulcsszóra. Már csak akkor van gond ha a "téma" vagy a "tartalom" csillagot tartalmaz :(
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Esetleg ' \* '-re keress, tehát szóközökkel együtt. Bár nem vagyok benne biztos, hogy ez egy ' * * ' stringet jól kezelne.
- A hozzászóláshoz be kell jelentkezni
Erre miért nem inkább egy célprogramot használsz? Jó, tudom, kihívás :)
Pl. a taskwarrior esetében:
task ls due:today
Szerk.: ismétlődést is lehet kérni a taskwarrior-ban, frequency mező. Van ismétlődés évente is (annual, yearly, 1y vagy hasonló, ahogy a manualban olvasom).
Ezt sokkal könnyebb kezelned, mint egy saját szkriptet. Bár kevesebb munka is van vele.
- A hozzászóláshoz be kell jelentkezni
Ez jó pofa! A Debian csomag neve "task".
Viszont nem, nekem mindenképpen a levelezésbe érdemes "beszúrnom" üzeneteket, ezt tuti olvasom! (Ráadásul, helyből sms -t is küldhetek a telefonomra ha az kell). Persze, kavintont szedni egyszerűbb lenne :)
Az itt lévő a dolgok (pl. névnap, szülinap, vagy leolvasni a gázórát 1 -én) olyan dolgok amiről hajlamos vagyok elfeledkezni és a mindennapi tevékenységemben egyfajta "megszakítást" igényel, simán belefeledkezem a dolgaimba, arról nem is beszélve ha valami közbejön a szokásos ritmushoz képest.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Már én arra gondoltam, hogy ez lenne az, ami a csillag karaktert kiváltaná. Ezután lenne egy szkripted, ami generálna egy output-ot ezekből a task-os kimenetekből:
TODAY=$(task ls due:today | grep -v "No matches.")
TOMORROW=$(task ls due:tomorrow | grep -v "No matches.")
if [ -n "$TODAY" ]; then
echo Mai teendők, évfordulók:
echo $TODAY
fi
if [ -n "$TOMORROW" ]; then
echo Holnapi teendők, évfordulók:
echo $TODAY
fi
És ennek a szkriptnek a kimenetét küldenéd el email-ben magadnak. Sőt, akár azt is csinálhatod, hogy már maga ez a szkript küldi a mailt, az "echo" parancsok helyett egy változóba fűznéd, és a változó tartalmát egy mail paranccsal vagy valamivel elküldöd.
Ezt a szkriptet pedig berakod a crontab-ba, és örülsz :)
Egyébként én azt csinálom, hogy a .bashrc-ben benne van a task parancs, így mindig kiírja az aktuális dolgokat, teendőket, illetve ha a naptárra ráviszem az egérkurzort, egy tooltip-ben megjelenik az infó.
- A hozzászóláshoz be kell jelentkezni
> Van valami ötlet hogy lehetne rávenni a shell -t, hogy átmenetileg NE értelmezgesse az argumentumokat?
man sh / bash / ksh - akármi, set parancs "-f" opció - kikapcsolja a globbingot, set +f pedig visszakapcsolja.
- A hozzászóláshoz be kell jelentkezni
Megnézem! Köszönöm a tippet, ezt tuti csak úgy "nézegetve" a man -t nem találom meg - így hogy "globbing" ...
(Neked fotografikus memóriád van?)
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
A csillag már-már megoldott, mire most látom más gond is van! A téma és a tartalom, hiába van időzőjellel vagy aposztroffal körülvéve, a szóközöknél szétbontja :(
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Nha, akkor hagyd a fenébe az eddigi sok marhaságot, és a
grep -v '^#' $1 | while read ROW
helyett legyen
grep -v '^#' $1 | while read ev ho nap ora perc email data
És akkor már csak a ${data} feldolgozásával kell megküzdeni, arra meg bármi jó csak a FS (field separator) állítgatásával kell kicsit matatni. Vagy ha rondán is megfelel akkor cut -d\" (és persze ha mindig van idézőjel a stringek körül).
- A hozzászóláshoz be kell jelentkezni
Fentebb gyakorlatilag ugyanezt javasoltam, legfeljebb én tartottam magam a crontab fájl felépítéséhez - abban bízva, hogy azt továbbgondolni már nem túl bonyolult.
- A hozzászóláshoz be kell jelentkezni
Jha, csak este nem volt lelkierőm válaszolni, reggel meg nem néztem végig a :(
- A hozzászóláshoz be kell jelentkezni
Jogos! Úgy tűnik a csillag sem gond így neki :)
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Lehetne tömb is, pl:
grep -v '^#' $1 | while read -a ROW
do
check_stamp "${ROW[@]}"
done
de ez sem segít a szóközök ellen, pl:
myecho -debug: 10 arguments:
1: '*'
2: '03'
3: '07'
4: '08'
5: '*'
6: 'tovis@localhost'
7: '"Tamás'
8: 'névnap"'
9: '"Tamás'
10: 'barátom"'
- A hozzászóláshoz be kell jelentkezni
Annyi ötlet elhangzott, hogy érdemben nem írok semmit, csak azt, hogy egy ilyen kis parsert megírni nem túl bonyolult, Linuxon rengeteg eszköz van szövegfeldolgozásra. Adott esetben awk scriptben gondolkodnék.
tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Gyors kérdés: Thunderbird Lightning nem oldja meg tokkal-vonóval a problémád? Bár nem használtam még, de nekem úgy tűnik, lehet jegyzeteket tenni benne, s képes figyelmeztetni.
tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
nem a kerdesre ad direktben valaszt, de jo kis todo/idokezelo/naptarprogram
- A hozzászóláshoz be kell jelentkezni
ruby-ban library e celra:
rufus-scheduler gem
pl. https://github.com/jmettraux/rufus-scheduler
rufus-scheduler is a Ruby gem for scheduling pieces of code (jobs). It understands running a job AT a certain time, IN a certain time, EVERY x time or simply via a CRON statement.
- A hozzászóláshoz be kell jelentkezni
Már-már azt mondanám kezd összeállni a dolog, nem is olyan szörnyen bonyolult:
#! /bin/sh
#
# Notify local user by mail using local MTA
#
#
NOW_YRS=`date +'%Y'`
NOW_MON=`date +'%m'`
NOW_DAY=`date +'%d'`
NOW_HRS=`date +'%H'`
/bin/echo -e "NOW:\t$NOW_YRS $NOW_MON $NOW_DAY $NOW_HRS\n"
#
ROW_COUNT=0
grep -v '^#' $1 | while read YRS MON DAY HRS ADDR SUBJECT TEXT
do
ROW_COUNT=`expr $ROW_COUNT + 1`
[ "$YRS" = "*" -o "$YRS" = $NOW_YRS ] || continue
[ "$MON" = "*" -o "$MON" = $NOW_MON ] || continue
[ "$DAY" = "*" -o "$DAY" = $NOW_DAY ] || continue
[ "$HRS" = "*" ] && HRS=0
[ $NOW_HRS -ge $HRS ] || continue
####
/bin/echo -e "$ROW_COUNT:\t$YRS $MON $DAY $HRS $ADDR $SUBJECT $TEXT"
echo $TEXT | /usr/bin/mail -s $SUBJECT $ADDR
done
Még több bogarászó dolog is van benne.
Viszont nagyon furcsa amit a SUBJKET és a TEXT -el csinál, itt egy példa sor amit a szűrő áteresztett:
* 03 07 * tovis@localhost "Teszt üzenet" "Teszt üzenet szöveg"
A változók értéke:
A $SUBJECT = "Teszt
A $TEXT = üzenet" " Teszt üzenet szöveg"
Ilyet még nem láttam :( Ha valaki ilyet kérne nem tudom, hogy kellene ezt összehozni.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Jajj, ez nagyon nem jó! Olyan változót ne olvass ki többször, amelynek egy értékére vagy kíváncsi, de az érték közben változhat. Például március 31-én éjfélkor kiolvasva simán március elsejét kaphatsz.
Vagy date +%s formát használj, s ezt a későbbiekben szintén date-tel konvertáld vissza - ez az érték viszont már nem mozog -, vagy tárold stringbe a date megfelelő formátumú kimenetét, amelyet szedj szét cut-tal:
datum=`date '+%-Y-%-m-%-d'`
ev=`cut -d- -f1 <<<"$datum"`
ho=`cut -d- -f2 <<<"$datum"`
nap=`cut -d- -f3 <<<"$datum"`
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Igazad is van, meg nem is. Ki fogom javítani, igérem!
Egyébként itt nem játszik, mivel szerintem 3-4 -szer fog lefutni naponta. Mivel veszkődtem eleget a dátum/idő stampekkel, a cronban soha nem állítok kerek órákat, a kedvencem az óra + 10 perc :)
Általánosságban azonban teljesen igazad van!
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Azért még nem kell bugot írni bele, mert éppen olyan körülmények lesznek valószínűleg, hogy a bug nem jön elő. Ráadásul nem bonyolult jól megcsinálni.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Picit kevesebb erőforrással:
set $(date +"%-Y %-m %-d")
ev=$1
ho=$2
nap=$3
- A hozzászóláshoz be kell jelentkezni
Ma is tanultam valamit. Nem ismertem a set azon tulajdonságát, hogy a shell változóinak lehet értéket adni vele.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ezek szerint nem olvastad a Kernighan - Pike Unix könyvet :-D
- A hozzászóláshoz be kell jelentkezni
Valóban nem.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Alapmu, sok-sok ev *X utan is erdemes elolvasni, bar az ismerkedes elejen jobb. (Csak nem konnyu manapsag hozzajutni - marmint papir alapon, nem tudom elektronikusan mi a helyzet.)
- A hozzászóláshoz be kell jelentkezni
Magyar nyelven is megjelent a Unix-bibliának számító Kernighan-Pike könyv. Címe:
Brian W. Kernigham - Rob Pike: A Unix operációs rendszer (Mûszaki könyvkiadó) Eredeti címe: The Unix programming environment.
Jelenleg is (1994 január) kapható Magyarországon, ára 800 forint körül van. Ha komolyan akarunk Unixal foglalkozni, akkor mindenképpen érdemes szert tennünk rá, mert hasznos és érdekes könyv, a hirdetéseket leszámítva mind a 350 oldala fontos dolgokat mond el a Unixról. Ez a legjobb magyar nyelven megjelent könyv a Unixról, amivel eddig találkoztunk.
(Orlando Unix iskola)
:)
- A hozzászóláshoz be kell jelentkezni
Még egy rácsodálkozás :) Úgy 90-es évek lején Indiában vettem meg ezt a könyvet - azóta ott hever a polcon. Levettem (leporoltam), belenéztem, hát nem tudom, de ezt végig olvasni súlyos testi fenyítésnek számítana. Tipikusan olyan könyv amit át kell futni, megjegyezni mi is van benne leírva, majd ha kell előveszed és megnézed azt a konkrét dolgot ami éppen felmerült. Anno nem tettem ezt meg :(
Viszont ha valakinek kell találtam egy ilyet:
http://www.freebookzone.com/goto.php?bkcls=os_unx&bkidx=26&lkidx=1
Esetleg egy wget -el le is lehet tölteni.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Indiaban vetted meg a magyar nyelvu UNIX-konyvet? Apam, informatikai hatalom lettunk!
(Megjegyzem, a velemenyem szerint ez pont az a konyv, amin nem atfutni kell, hanem alaposan elolvasni - ez persze hosszabb ido. Persze ezt csak annak erdemes igy, aki *X-szel komolyabban akar foglalkozni, mert akkor megterul a belefeccolt munka.)
- A hozzászóláshoz be kell jelentkezni
:) Anno én teljesen kezdőként, nagyjából nulla tudással vettem meg és olvastam el úgy, hogy nem nagyon volt lehetőségem gyakorolni/próbálgatni a leírtakat - ne felejtsük el, hogy 1992-'93 táján jártunk (és ez már a 2. kiadása volt a könyvnek, az első, még szürke borítós, ha jól tudom 1987 körül jelent meg...).
- A hozzászóláshoz be kell jelentkezni
Szinten, bar en az elso kiadast vettem meg boltbol frissiben, es a Vifiben lehetoseg is volt kicsit gyakorolgatni. Gep az volt hozza. Hamarosan mar sajat is ;-) (Miutan egy rosszul sikerult lex-koddal kisse leultettem a fejlesztoi szervert.)
- A hozzászóláshoz be kell jelentkezni
Nem, természetesen angol nyelvű. Az első kiadás 1984 Prentice-Hall és amit megvettem az a hatodik indián újranyomtatás :)
Soha nem "olvastam ki" ilyen könyveket - forgattam - amikor megvettem még nekem sem volt mivel gyakorolni, próbálgatni, jó 10 év kellett mire *X -hez fértem, addigra meg elfelejtettem. Akkor a Kernighan név miatt vettem meg, hisz ez a név jegyzi a C programozók "Holy Bible" -ját, Ritchie -vel megosztva.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Nagyon tetszik! Megvéve! :D
megjegyzés: nem gondoltam volna, hogy egy ilyen egyszerű kis feladvány kapcsán ennyi mindent fogok tanulni :) Köszönöm!
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
... és megtaláltam egy az egyik gyakorlásomat :)
set ${2:-egy ${1:-kettő három}}" "$1
echo $1" "$2" "$3
a medve látása:
$ ./defvar
egy kettő három
$ ./defvar 'egy kettő' három
három kettő egy
$ ./defvar egy
egy egy egy
- A hozzászóláshoz be kell jelentkezni
Ebben a sorban
echo $1" "$2" "$3
mi a szerepe az idézőjeleknek az olvashatóság rontásán felül, illetve ha már vannak (ami feloldáskor egyébként mindig dicséretes gyakorlat), akkor miért nem így
echo "$1 $2 $3"
?
- A hozzászóláshoz be kell jelentkezni
A $SUBJECT, $ADDR, $TEXT körül lehagytad az idézőjeleket. Szóközök mentén széthullik a helyettesítés több paraméterre.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Nem: már a változóban "rosszul" van, és pont azért, amiről tegnap már szó esett: az IFS uralja a pályát.
Ami egyszerű ma a dologban, az tegnap is az volt, az idézőjelek elemzése terén viszont semmi mozgás.
A furcsa viselkedésre a válasz ott van a read manjában.
- A hozzászóláshoz be kell jelentkezni
Igazad van, ezt lehet, awk-val kellene megetetni. Viszont a $SUBJECT helyettesítést mindenképpen idézőjelbe tenném, mert ha abban szóköz van, ami elég valószínű, akkor annak csúnya vége lesz.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Persze, és nem csak azt, hanem - ahogy ez ilyenkor el szok hangozni - nagyon indokolt eset kell ahhoz, hogy egy változófeloldás ne idézőjelek között történjen.
Az awk egyébként nem sokat segít, amikor igazi elemzésről van szó, és arról van, ha fel kell készülni az az idézőjelben escape-elt idézőjel esetére, ahol lehet, hogy a repjel nem is az idézőjelhez, hanem pl. egy másik repjelhez tartozik.
Ebben az elemzésben több érdemi logika lesz, mint szkript egyéb helyein összesen, ami inkább ujjgyakorlat.
- A hozzászóláshoz be kell jelentkezni
Az awk miért nem segít? Sima progremnyelv, kb. C szintaxissal bármit meg lehet benne írni szinte. Egy ilyen parsert simán.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ha nem awk-ként akarod használni, az más - persze, lehet benne darabolni, gyalogolni és hasonlók... de ilyenkor jön az a pont, hogy akkor már inkább az egészet perlben.
- A hozzászóláshoz be kell jelentkezni
Már a változóban hibás! Így az outputnál már hiába teszem idézőjelek közé :(
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Na ez már úgy tűnik, működik!
#! /bin/sh
#
# Notify local user by mail using local MTA
#
#
NOW_DATE=`date +'%Y %m %d %H'`
NOW_YRS=`echo $NOW_DATE | cut -b 1-4`
NOW_MON=`echo $NOW_DATE | cut -b 6-7`
NOW_DAY=`echo $NOW_DATE | cut -b 9-10`
NOW_HRS=`echo $NOW_DATE | cut -b 12-13`
# /bin/echo -e "NOW:\t-$NOW_YRS-$NOW_MON-$NOW_DAY-$NOW_HRS-"
###
ROW_COUNT=0
grep -v '^#' $1 | while read ROW
do
ROW_COUNT=`expr $ROW_COUNT + 1`
echo "$ROW_COUNT:\t$ROW"
YRS=`echo "$ROW" | awk '{print $1}'`
MON=`echo "$ROW" | awk '{print $2}'`
DAY=`echo "$ROW" | awk '{print $3}'`
HRS=`echo "$ROW" | awk '{print $4}'`
ADDR=`echo "$ROW" | awk '{print $5}'`
#SUBJECT=`echo "$ROW" | cut --delimiter='"' -f 2`
#TEXT=`echo "$ROW" | cut --delimiter='"' -f 4`
SUBJECT=`echo "$ROW" | awk 'BEGIN {FS="[\t\"]"} {print $2}'`
TEXT=`echo "$ROW" | awk 'BEGIN {FS="[\t\"]"} {print $4}'`
/bin/echo -e "$ROW_COUNT:\t-$YRS-$MON-$DAY-$HRS-$ADDR-$SUBJECT-$TEXT-"
echo "$TEXT" | /usr/bin/mail -s "$SUBJECT" "$ADDR"
done
A SUBJECT és a TEXT kibontása, akár awk akár cut működik. Azt nem igazán értem, hogy miért nem 1 és 2 mező, hanem 2 és 4 es. Ha valaki tudja súgjon.
Mondjuk, ezzel az erővel akár a dátum időt is kivehetem cut segítségével, majd meglátom (gondolom a cut kevésbé erőforrás igényes mint az awk, másképp nincs jelentősége.
Kérlek fussátok át, hátha találtok még valami javítani valót.
Még van olyan hátsó gondolatom, hogy a TEXT mező lehetne (vagylagosan) fájl referencia is (azaz a szöveget ha hosszú lehetne egy másik fájlból venni) de már ez is nagyon jó lesz. Így utólag nem is olyan nehéz de jó sok időt elvitt.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Nem egyszerűbb lenne a cut-ot így paraméterezni?
cut -d' ' -f1
cut -d' ' -f2
cut -d' ' -f3
stb. Amit írtál, abban az a kellemetlen, hogy merev pozíciókat vágsz ki, így nem működik akkor, ha a date-tel a vezető 0-kat nem íratod ki, s emiatt változhat a hónap, nap leírt hossza.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Mint azt láthatod, még az is gondot okoz, hogy a "field" hanyadik lesz? Ebbe már nem először futottam bele, de még nem találtam értelmes magyarázatot. Field -et ezért csak akkor használok ha muszáj, a field sorszámát "kipróbálásos" alapon kell kitalálnom ami azért nem mindig nyerő, hiszen nem értem miért épp annyi.
Egyébként azt hol tudnám beállítani, hogy ne írja ki a vezető nullákat?
Ennek már néhányszor neki futottam, pl. különösen zavaró, ha be kell állítani a dátum/időt - általában kérek egy "help" -et mert a fene emlékszik a pontos szekvenciára (amikor ilyet kell művelnem, általában valami gond van és amúgy is ideges vagyok). Így az USA angol(?) dátum/idő kijelzés eléggé zavaró - pont mint az önkiszolgálóban, amikor a lejárati dátumot próbálod kiolvasni.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Az első delimitert megelőző rész az első mező, utána jön a delimiter, aztán a második mező, delimiter, a harmadik mező, s így tovább.
Azt érdemes tudni, hogy ha több delimiter jön közvetlenül egymás után, akkor ezek nem kerülnek összevonásra, hanem két ilyen delimiter között üres string lesz a field. Ebből az is jön, hogy ha delimiterrel kezdődik a sor, akkor az első mező üres string lesz. Nem kell próbálgatni. A date kimenetében meg tudod határozni a formátumot, ott pont kényelmesen jönnek ki a dolgok, sohasem lesz két delimiter egymás mellett, hacsak magaddal kiszúrásból nem generáltatsz vele olyan kimenetet.
A date kimenetében a vezető 0-k kioltása a '%' jelet követő '-' jel.
date +%m
03
date +%-m
3
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Még csak annyit, hogy bash-ben vigyázz a vezető 0-kkal, mert aritmetikai műveletekben oktálisan értelmezi a shell a 0-val kezdődő számot:
echo $[011]
9
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Bizisten nem értem mi a gondod a $2-vel és $4-gyel, ha egyszer tényleg ott vannak az értékek.
Mindegy.
Némi bashista gondolatébresztő:
parsethis() {
local ROW=$1
echo "DEBUG1: \$#=$#"
set -f
eval set $ROW
set +f
echo "DEBUG2: \$#=$#"
echo "\$1=<$1>, \$6=<$6>, \$7=<$7>"
}
while read ROW; do
parsethis "$ROW"
done < teszt.txt
- A hozzászóláshoz be kell jelentkezni
Vagyis kikapcsolod a "globbing" -ot az értelmezéshez. Ki fogom próbálni, eddig ezt azért nem tettem, mert sosem olvastam végig a bash/dash manuált, így nem tudtam, hogy a "set" erre is alkalmas :)
A csillag problémát megoldja! Viszont, az idézőjelek közé írt szöveget nem tudja helyesen kezelni :(
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
A csillagok problémáját megoldja, azonban az idézőjelekkel határolt dolgokat nem jól kezeli :(
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Azt neked kell megoldanod például awk-val.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
???
Pont azt a célt szolgálja az eval set, hogy a megfelelő részek kerüljenek a megfelelő pozícionális paraméterekbe:
$> cat teszt.txt
* 03 07 08 * tovis@localhost "Tamás névnap" "Tamás barátom"
$> cat x.sh
parsethis() {
local ROW=$1
echo "DEBUG1: \$#=$#"
set -f
eval set $ROW
set +f
echo "DEBUG2: \$#=$#"
echo "\$1=<$1>, \$6=<$6>, \$7=<$7> \$8=<$8>"
}
while read ROW; do
parsethis "$ROW"
done < teszt.txt
$> ./x.sh
DEBUG1: $#=1
DEBUG2: $#=8
$1=<*>, $6=<tovis@localhost>, $7=<Tamás névnap> $8=<Tamás barátom>
$>
- A hozzászóláshoz be kell jelentkezni
Tényleg, én meg az eval-ról meg is feledkeztem, aztán beszélek itt össze-vissza.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
cut és awk erőforrásigénye mai gépeken, nem-extrém felhasználással gyakorlatilag egyenlő.
- A hozzászóláshoz be kell jelentkezni
Szia!
Ha jól értem a crontab buzergálása azért nem jó neked mert nem szeretnéd a mostanit összepiszkítani...
Miért nem hozol létre egy külön felhasználót, mondjuk "notice" néven, akit lezársz.
A figyelmeztetéseidet pakolhatnád ennek a felhasználónak a crontabjába.
A crontab fájl elejére rakd be a "MAILTO=emailcimem@enyimedomain.hu"-t, így még azzal sem kell foglalkoznod hogy miképp küldje el a levelet, igaz így a tárgy mezőre nem lesz ráhatásod, de talán ez nem is lényeg. A crontabbal futtatott parancs meg lehet egy egyszerű "echo A levél szövege"
-Mr-
- A hozzászóláshoz be kell jelentkezni
Köszönöm a sok jó ötletet, tanácsot. A következő verziót elkezdtem tesztelni (ha valakit érdekel):
#! /bin/sh
#
# Notify local user by mail using local MTA
# ver 0.2.3
#
NOTIFY_LIST=$1
#####
set $(date +'%Y %m %d %H')
NOW_YRS=$1
NOW_MON=$2
NOW_DAY=$3
NOW_HRS=$4
echo "Check notificĂtion list at: $NOW_YRS $NOW_MON $NOW_DAY $NOW_HRS\n"
####
ROW_COUNT=0
grep -v '^#' $NOTIFY_LIST | while read ROW
do
ROW_COUNT=`expr $ROW_COUNT + 1`
/bin/echo -e "IN $ROW_COUNT:\t$ROW"
####
YRS=`echo "$ROW" | cut --delimiter=' ' -f 1`
MON=`echo "$ROW" | cut --delimiter=' ' -f 2`
DAY=`echo "$ROW" | cut --delimiter=' ' -f 3`
HRS=`echo "$ROW" | cut --delimiter=' ' -f 4`
MTO=`echo "$ROW" | cut --delimiter=' ' -f 5`
SBJ=`echo "$ROW" | cut --delimiter='"' -f 2`
TXT=`echo "$ROW" | cut --delimiter='"' -f 4`
[ "$YRS" = "*" -o "$YRS" = $NOW_YRS ] || continue
[ "$MON" = "*" -o "$MON" = $NOW_MON ] || continue
[ "$DAY" = "*" -o "$DAY" = $NOW_DAY ] || continue
[ "$HRS" = "*" ] && HRS=0
[ $NOW_HRS -ge $HRS ] || continue
####
/bin/echo -e "OUT $ROW_COUNT:\t-$YRS-$MON-$DAY-$HRS-$MTO-$SBJ-$TXT-\n"
####
echo "$TXT" | /usr/bin/mail -s "$SBJ" "$MTO"
done
Eddig jól viselkedik, azt csinálja amit kell.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Nem hülyebiztos, de gondolom, nem is az a cél. A szövegekben nem lehet idézőjel, még escape-elve sem.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
A szövegekben nem terveztem nagyon komoly tartalmat. Távlati tervekben olyan szerepel, hogy a mező egy hivatkozás lehet valami fájlra, de egyenlőre már evvel is rém boldog vagyok :D
Megjegyzés: A házi szerveremen jelenleg FAX vétel is van, az mgetty segítségével, amihez egy "new_fax" scriptum is van, nem szeretném ennyire megbonyolítani a dolgot. Semmi csicsa, működjön, jelezze amire emlékeztetni akartam magamat!
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
Persze, van egy bizonyos szint, ami fölött nem biztos, hogy érdemes szépészkedni. Egyszer néztem az Ubuntu Grub2 splash screen scriptjét, az érdemi teendő két sor volt benne, a többi, nagyjából a script 98 %-a pedig hibakezelés, a legvadabb dolgokra való felkészülés volt.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni