Sprawdzanie czy plik nie zmieni
Wersja poprawiona. "Ciężki" awk zastąpiony "lżejszym" cut, zmodyfikowany warunek w jednym elif i wywalony jeden if. Oraz dodane komentarze praktycznie do każdej linijki. Teraz powinno być wszystko jasne.
Jeżeli to ma działać jako osobny skrypt to mogę dorobić funkcję sprawdzającą czy podano wymaganą liczbę parametrów oraz coś w stylu --usage. Jeżeli zrobisz ^c^v do swojego kodu to te funkcje będą zbędę ewentualnie sam je dopiszesz już jak Ci trzeba 
@fnmirk winnetou a nie winnetu
)
Kod: Zaznacz cały
#################################
# Author: Przemysław "winnetou" Wilkosz #
# Jabber: [email]winnetou@jabster.pl[/email] #
# E-mail: [email]wilkosz.p@gmail.com[/email] #
# Licence: Creative Commons Attribution #
# Desc: Line counter for files #
#################################
#!/bin/sh
# First param given to scrip it's file name you want to watch
FILE=$1
# Second param it's maximum allowed lines.
MAX_LINES=$2
# Sepcial flag set to 1 if number of lines in file is equal to allowed maximum
EQUAL=0
# Special flag that informs that lines in file exceeded allowed maximum
EXCEEDED=0
# Caiable that handles number of lines in file before change
OLD_LINES=0
# When number of lines in file is equal to allowed maximum show this message
MSG1="Liczba linijek w pliku osiagnela dopuszczalne maksimum"
# When numer of lines in file exceed allowed maximum show this message
MSG2="Liczba linijek przekroczyla dopuszczalne maksimum."
# Begin infinity loop
while [ 1 ]
do
# read number of lines in watched file
LINES=`wc -l $FILE | cut -d " " -f 1`
# if $LINES is equal to $MAX_LINES and flag $EQUAL is not set
if [[ $LINES -eq $MAX_LINES && $EQUAL -eq 0 ]]
then # then
# set the $EQUAL flag to aviod dispalyn warning in each loop run
EQUAL=1
# and dispaly warning message
echo "`date`: $MSG1"
# else if $EXCEEDED flag is not set (we haven't exceeded $MAX_LINES) and $LINES is greater then
# $MAX_LINES (it's the first time when we exceeded maximum)
#
# This is true expression at the first excess. Then it always false so there's no need to check second part
# of expression so the script runs faster
elif [[ $EXCEEDED -eq 0 && $LINES -gt $MAX_LINES ]]
then # then
# set $EXCEEDED flag to avoid entering this part of if statement
EXCEEDED=1
# save current number of lines
OLD_LINES=$LINES
# print error message
echo "`date`: $MSG2"
# else if $LINES is greater then $MAX_LINES and $OLD_LINES (we have added some lines to watch file)
elif [[ $LINES -gt $MAX_LINES && $LINES -gt $OLD_LINES ]]
then # then
# print error message
echo "`date`: $MSG2"
# save current number of lines
OLD_LINES=$lINES
# end if statement
fi
# wait with next run for 2 seconds
sleep 2
# end of loop
done

@fnmirk winnetou a nie winnetu

Nie, to będzie działać jako część innego skryptu, a co do sprawdzania czy wszystkie parametry są podane to raczej nie musisz się trudzić. Ale nadal nie odpowiedziałeś na moje pytanie: masz zamiar dalej współpracować, czy nie i czy ewentualny wpis w ,,credits'', który tobie zaproponowałem to Ci odpowiada?
Edycja:
Zapomniałem podziękować. I choć nie mogę teraz sprawdzić czy działa - nie jestem w domu i nie mam dostępu do Linuksa - to mam 100% pewność, że działa.
Edycja 2:
Tak mi się teraz, jak już w domku jestem, przypomniało po co awk, po co cut? Nie lepiej zastosowanie "najlżejszej" technologii?
Edycja 3:
I jeszcze dwie sprawy: Po pierwsze dlaczego stosujesz angielskie komentarze? I jeszcze jedno dlaczego stosujesz `` a nie $()? Niby żadna różnica ale to ``, mnie się czasem mylą ze zwykłym '' (a co do komentarzy to zbędne skoro wytłumaczyłeś o co chodzi to po co drugi raz słuchać tego samego).
Edycja:
Zapomniałem podziękować. I choć nie mogę teraz sprawdzić czy działa - nie jestem w domu i nie mam dostępu do Linuksa - to mam 100% pewność, że działa.
Edycja 2:
Tak mi się teraz, jak już w domku jestem, przypomniało po co awk, po co cut? Nie lepiej zastosowanie "najlżejszej" technologii?
Kod: Zaznacz cały
LINES=`cat $FILE | wc -l`
I jeszcze dwie sprawy: Po pierwsze dlaczego stosujesz angielskie komentarze? I jeszcze jedno dlaczego stosujesz `` a nie $()? Niby żadna różnica ale to ``, mnie się czasem mylą ze zwykłym '' (a co do komentarzy to zbędne skoro wytłumaczyłeś o co chodzi to po co drugi raz słuchać tego samego).
Jeśli chodzi o pomoc to zawsze jest forum/PM/jabber więc jak będę w stanie i będę miał wolną chwilę to czemu nie. Ale nie rzucę wszystkiego co mam tylko po to żeby napisać fragment kodu czy debugować już istniejący - nie jest to moim priorytetem chwilowo mam inne zmartwienia na głowie
Wpis w Credits czemu nie możesz ewentualnie dopisać do niego JIDa
)
A skrypt testowałem tak:
- utworzyłem plik:
- na jednej konsoli odpaliłem skrypt:
- na drugiej konsoli klepnąłem:
- trzeciej konsoli:
W ten sposób na trzeciej konsoli co sekundę wyświetlało mi zawartość pliku ~/plik.txt. Druga konsola co 6 sekund dopisywała do pliku cyfrę oraz znak nowej linii. A na pierwszej konsoli obserwowałem wynik działania skryptu. W momencie gdy do pliku została wpisana liczba 5 na pierwszej konsoli pojawił się komunikat spod zmiennej $MSG1 kolejne linijka powodowały wyświetlenie $MSG2. W momencie gdy pętla z drugiej konsoli zakończyła działanie, plik nie zmieniał zawartości i na pierwszej konsoli nie pokazywały się nowe komunikaty. Zdaję sobie sprawę, z tego że nie jest to wystarczający zestaw testowy ale w domyślnym zastosowaniu się sprawdził.
P.S.
W razie problemów z działaniem daj cynk pomyślimy i poprawimy w miarę możliwości
P.S.2
Na zdrowie bierz i korzystaj
P.S.3
@fnmirk nic się nie stało
DODANO
Można ale wcale nie jestem pewien czy to jest "lżejsze" rozwiązanie
Przy kat dodatkowo dochodzi Ci "męczenie konsoli" i dodatkowe wywołania funkcji wejścia/wyjścia.


A skrypt testowałem tak:
- utworzyłem plik:
Kod: Zaznacz cały
touch plik.txt
Kod: Zaznacz cały
sh file_watch ~/plik.txt 5
Kod: Zaznacz cały
for i in `seq 1 10`; do echo $i >> ~/plik.txt; sleep 6;done
Kod: Zaznacz cały
watch -n 1 cat ~/plik.txt
P.S.
W razie problemów z działaniem daj cynk pomyślimy i poprawimy w miarę możliwości

P.S.2
Na zdrowie bierz i korzystaj

P.S.3
@fnmirk nic się nie stało
DODANO
Można ale wcale nie jestem pewien czy to jest "lżejsze" rozwiązanie

Z tym cat to fakt nie przemyślałem tego dobrze, ale w końcu człowiek uczy się całe życie. Zaś co do samego skryptu najwyraźniej spisuję się wyśmienicie, teraz wystarczy poprawić funkcje kill no i wprowadzić nk, a potem już tylko integracja, a może raczej interakcja z paroma pythonkami. No i wydanie alfa, potem tylko instalator i mamy betę, a potem pomyślimy.
Ps. Przeczytaj Edycje 3 z poprzedniego mojego posta
Ps. Przeczytaj Edycje 3 z poprzedniego mojego posta
Odnośnie komentarzy:
Dobry kod to taki gdzie na jedną linijkę kodu przypada 10 linii komentarza. Dlaczego? Choćby dla tego, że jak zaglądniesz do tego za pół roku to możesz nie wiedzieć o co chodzi w danym momencie a dochodzenie do tego podczas analizy poprzednich fragmentów kodu jest męczące.
Dlaczego komentarze po angielsku? jakoś tak z przyzwyczajenie większość programów jakie pisze ma angielskie komentarze, nazwy zmiennych i komunikaty. A to przede wszystkim dlatego, że nigdy nie wiesz kto zaglądnie do kodu i kto go będzie używał. Poza tym zdarzało mi się prosić "zagraniczniaków" (m.in deweloperów z Sun Microsystems Inc ;]) o pomoc a dla nich kod po polsku byłby tak samo niezrozumiały jak dla nas w suahili
Ad apostrofów.
` to jest tak zwany lewy apostrof służy m.in do umieszczania w zmiennych wyników działania polecenia.
Pojedynczy apostrof znosi działanie znaków specjalnych w poleceniach typu echoi innych. Dzięki temu można umieścić sekwencje typu: i zostanie wypisane wszystko tak jak jest w apostrofie. Przy zastosowaniu standardowego podwójnego apostrofu znaki specjalne trzepa "wyeskejpować" czyli poprzednia konstrukcja musiałaby wyglądać tak:
Dobry kod to taki gdzie na jedną linijkę kodu przypada 10 linii komentarza. Dlaczego? Choćby dla tego, że jak zaglądniesz do tego za pół roku to możesz nie wiedzieć o co chodzi w danym momencie a dochodzenie do tego podczas analizy poprzednich fragmentów kodu jest męczące.
Dlaczego komentarze po angielsku? jakoś tak z przyzwyczajenie większość programów jakie pisze ma angielskie komentarze, nazwy zmiennych i komunikaty. A to przede wszystkim dlatego, że nigdy nie wiesz kto zaglądnie do kodu i kto go będzie używał. Poza tym zdarzało mi się prosić "zagraniczniaków" (m.in deweloperów z Sun Microsystems Inc ;]) o pomoc a dla nich kod po polsku byłby tak samo niezrozumiały jak dla nas w suahili

Ad apostrofów.
` to jest tak zwany lewy apostrof służy m.in do umieszczania w zmiennych wyników działania polecenia.
Pojedynczy apostrof znosi działanie znaków specjalnych w poleceniach typu echoi innych. Dzięki temu można umieścić sekwencje typu:
Kod: Zaznacz cały
echo ' ble \ble'
Kod: Zaznacz cały
echo "ble \\ble
Dobry kod to taki gdzie na jedną linijkę kodu przypada 10 linii komentarza. Dlaczego? Choćby dla tego, że jak zaglądniesz do tego za pół roku to możesz nie wiedzieć o co chodzi w danym momencie a dochodzenie do tego podczas analizy poprzednich fragmentów kodu jest męczące.
Nie zgadzam się. Komentować powinno się najważniejsze fragmenty a nie cały kod. Co do języka najlepiej używać angielskiego a przede wszystkim nie mieszać języków np. polski z angielskim. Ważnym elementem są również wcięcia w kodzie, które sprawiają że jest czytelniejszy.
Pozdrawiam.
Jeżeli piszę kod tylko dla siebie to:
- zmienne nazywam tak, że nawet po 2 latach wiem do czego służą i/lub komentuję ich przeznaczenie
- nie komentuje całego kodu tylko funkcje, czy ważniejsze fragmenty ale zdarza się tak że jakaś funkcja ma 10 linijek kodu a komentarzy jest na drugie tyle bo akurat tak pasuje czy wymyśliłem jakiś "skrótowy" przebieg, o którym pewnie za tydzień bym zapomniał.
Jeżeli piszę kod dla kogoś to komentuje jak najwięcej i jak najobszerniej, żeby mi nikt nie zawracał głowy a jak już zawróci to żebym nie miał problemów z "co autor miał na myśli" i dlaczego tak a nie inaczej.
Dużo zależy od tego dla kogo się piesze kod, jak bardzo jest skomplikowany i jak często będzie się do niego zaglądać. Ale z tym to jest tak samo jak ze wszystkim innym. Ilu programistów/koderów tyle podejść do spraw komentarzy.
Fakt nie powinno się mieszać języków, moja wina zawaliłem tutaj. Ale pierwotnie kod był nieskomentowany i po polsku, potem po prostu zapomniałem zmienić komunikaty. Ale jeszcze nikt nie napisał bezbłędnego i idealnego kodu za 2 posiedzeniami.
- zmienne nazywam tak, że nawet po 2 latach wiem do czego służą i/lub komentuję ich przeznaczenie
- nie komentuje całego kodu tylko funkcje, czy ważniejsze fragmenty ale zdarza się tak że jakaś funkcja ma 10 linijek kodu a komentarzy jest na drugie tyle bo akurat tak pasuje czy wymyśliłem jakiś "skrótowy" przebieg, o którym pewnie za tydzień bym zapomniał.
Jeżeli piszę kod dla kogoś to komentuje jak najwięcej i jak najobszerniej, żeby mi nikt nie zawracał głowy a jak już zawróci to żebym nie miał problemów z "co autor miał na myśli" i dlaczego tak a nie inaczej.
Dużo zależy od tego dla kogo się piesze kod, jak bardzo jest skomplikowany i jak często będzie się do niego zaglądać. Ale z tym to jest tak samo jak ze wszystkim innym. Ilu programistów/koderów tyle podejść do spraw komentarzy.
Fakt nie powinno się mieszać języków, moja wina zawaliłem tutaj. Ale pierwotnie kod był nieskomentowany i po polsku, potem po prostu zapomniałem zmienić komunikaty. Ale jeszcze nikt nie napisał bezbłędnego i idealnego kodu za 2 posiedzeniami.
Myślałem, że jeszcze nikt nie napisał kodu idealnego.Ale jeszcze nikt nie napisał bezbłędnego i idealnego kodu za 2 posiedzeniami.
Co do komentarzy to każdy ma troszkę inne podejście. Sam też nie lubię komentowania każdej linii kodu. Raczej komentarze grupowe, odnoszące się do kilku (kilkunastu) linii kodu.