Chceme kazdou noc nasi drahe polovicce odeslat romantickou SMSku. SMSky mame ulozene v textovem souboru, na kazdem radku jednu SMSku. Nas skript by mel ze souboru "vykousnout" prvni radek a poslat ho mailem na nejakou adresu (pro testovani nasi, pozdeji to muzeme prepsat na adresu SMS brany). Co znamena vykousnout? Skript vezme prvni radku a tu odesle mailem, nacez tuto radku smaze - po dobehnuti skriptu tedy bude v souboru o prvni SMSku mene. Tim mame zajisteno, ze po dalsim spusteni skriptu pristi noc se posle jina (druha) SMSka. Priklad: Testovaci sadu SMSek (nepsal jsem je ja ;-) najdete na: http://kam.mff.cuni.cz/~pasky/sms.txt Soubor si muzete stahnout treba prikazem wget ci curl. Jak je videt, je dulezite, aby skript poslal _prvni_ SMSku v souboru, nikoliv posledni. Po spusteni skriptu by tedy mel byt odeslan mail s obsahem Nejdulezitejsi veci by mel clovek stale nosit pri sobe. Tak teda nevim jak te nacpu do batuzku. a v souboru sms.txt by melo zbyt: Jen jedno prani by si me srdce pralo,aby bylo srdcem tvym stale milovano. ...apod... ----------------------------------------------------------------------- ----------------------------------------------------------------------- Reseni ulozky... head -n 1 sms.txt | mail -s SMS fis@bofh.cz tail -n $((`cat sms.txt | wc -l` - 1)) sms.txt >sms.txt ...NEFUNGUJE. Jeste jednou, je SPATNE. Redirect do souboru sms.txt ho prepise (na prazdny soubor), a to jeste driv, nez ho tail staci otevrit. head -n 1 sms.txt | mail -s SMS fis@bofh.cz tail -n $((`cat sms.txt | wc -l` - 1)) sms.txt | cat >sms.txt ...funguje pouze ZDANLIVE (pokud vubec), a je stale SPATNE. Muze se opet za nepriznive situace stat, ze tail otevre soubor pozdeji, nez se provede redirect, pripadne se mu soubor pod rukama prepise, pokud bude tak dlouhy, ze ho tail nestihne precist najednou. Tomu se rika tzv. race condition. Jak tedy na to? head -n 1 sms.txt | mail -s SMS fis@bofh.cz tail -n $((`cat sms.txt | wc -l` - 1)) sms.txt >tmp mv tmp sms.txt Potizi jsme se zbavili, zapisujeme totiz do jineho souboru, nez ktery cteme - nemuze nas tedy potkat nic zleho. Rozmyslete si (pokud jste nebyli na cviceni), proc pouzivame cat sms.txt | wc -l a nikoliv jednoduse wc -l sms.txt (nebo nerozmyslejte, ale experimentujte). Alternativni reseni? Vsimneme si, ze tail ma dva rezimy - jednak vypsat poslednich N radku (to jsme vyuzili ted), a jednak zacit vypisovat soubor od N-teho radku. Tim se nam to cele jeste zjednodusuje: head -n 1 sms.txt | mail -s SMS fis@bofh.cz tail -n +2 sms.txt >tmp mv tmp sms.txt (Znamenko "+" je prave dulezite.)