Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1






Admin łajza







Nasz forumowy kolega — Minio — popełnił tekst ku przestrodze młodych (i trochę starszych) skrypciarzy.
Jeśli ktoś nie wie co jest złego na przykład w:
head -n15 file.txt |tail -n1 cat file.txt | grep -i foo
powinien się koniecznie zapoznać z tymże.
http://minio.jogger.pl/2009/11/21/popularne-bledy-p … ptow-powloki/
Offline




Użyszkodnik
Czekam na piękne kobiety, drogie alkohole i szybkie samochody.
;)
Offline




złodziej wirków ]:->
Minio napisał(-a):
Czekam na piękne kobiety, drogie alkohole i szybkie samochody.
;)
A mogą być szybkie kobiety, drogie alkohole i piękne samochody?? ;)
Offline






Admin łajza







winnetou napisał(-a):
Minio napisał(-a):
Czekam na piękne kobiety, drogie alkohole i szybkie samochody.
;)A mogą być szybkie kobiety, drogie alkohole i piękne samochody?? ;)
z XMPP pewnych osobników:
[22:32:26] azhag: http://forum.dug.net.pl/viewtopic.php?pid=134358#p134358 ;)
[22:33:08] Minio: :)
[22:33:23] Minio: czekam na piękne kobiety, drogie alkohole i szybkie samochody ;)
[22:34:57] azhag: przykro mi, obecnie w asortymencie są tylko szybkie kobiety, piękne alkohole i drogie samochody
[22:35:48] Minio: no cóż. Lepszy rydz niż nic ;)
;)
Offline




złodziej wirków ]:->
Pozwolę sobie zauważyć, że alkohol nie musi być piękny, ważne żeby poniewierał ;)
Offline




Użyszkodnik
I że nawet niepiękne kobiety ładnieją po nim w oczach ;) .
Offline




Moderator Mamut
fajny tekst, ale pozwole sobie na kilka uwag:
1. najpopularniejszym programem wymagajacym przyjmowania pliku przez stdin jest tr
2. przelacznik -q w grepie ma jedna istotna zalete - konczy przeszukiwanie na pierwszej znalezionej linii
3. zastanowic sie nalezy nad wydajnascia head|tail vs awk przy bliskich poczatku liniach w dlugich plikach
4. zmienne z bialymi znakami nie zawsze powinny byc ujmowane w cudzyslowia - np. for a in "$ttt"; do echo $a; done niekoniecznie bedzie dzialac tak jakbysmy tego oczekiwali
5. LANG=C jest przydatne tez przy problemie kropka vs przecinek ... czesc programow uzywa do tego locale a czesc nie wiec w skryptach lepiej robic z LAN=C
6. sama wieloliniowosczmiennych obslugiwanych po linii jest kiepskim argumentem za plikami tymczasowymi ... to mozna robic na ogol w samej powloce, raczej wymogi pewnych programow ...
Edit co do samego skryptu krory byl inspiracja mnie razi troche masa wywolan awk aby uzyskac zmienne shelowe tylko po to aby potem to wypisac przy uzyciu echo ... mozna to zebrac wszystko wwewnatrz awk i wewnatrz niego wypisac ...
Ostatnio edytowany przez bercik (2009-11-21 23:06:52)
Offline






Admin łajza







bercik napisał(-a):
2. przelacznik -q w grepie ma jedna istotna zalete - konczy przeszukiwanie na pierwszej znalezionej linii
Co naturalnie można osiągnąć w każdej sytuacji (-m 1). Ale
grep -m 1 fraza plik.txt >/dev/null 2>&1
jest jeszcze mniej KISS.
Ostatnio edytowany przez azhag (2009-11-22 00:20:21)
Offline




Użyszkodnik
bercik:
1. Przyjęte. Siłą rzeczy go ten błąd nie dotyczy. Poza tym pisałem o „zdecydowanej większości” a nie wszystkich.
2. azhag mnie wyręczył.
3. Z braku kompetencji pozostawiam bez komentarza. Z pewnością można spojrzeć na to z perspektywy wydajności na bardzo dużych plikach i artykuł mógłby wyglądać trochę inaczej. Mogę co najwyżej napisać że jeżeli ktoś operuje na bardzo dużych plikach, pisze skrypty z myślą o wydajności oraz wie że można to samo zrobić w awk, to i tak dobierze narzędzia stosownie do zadania. Jak tez napisałem we wstępie — to tylko zalecenia a nie żelazne reguły których należy przestrzegać zawsze i wszedzie.
4. Jw. Oczywiście masz rację, otoczenie w cudzysłowie zmiennej która będzie argumentem dla for przyniesie skutek odwrotny od oczekiwanego.
6. To tylko pierwszy przykład który przyszedł mi do głowy. Nie zastanawiałem się dlaczego ktokolwiek może potrzebować pliku tymczasowego i nie o tym traktuje artykuł. Ja uznaję, że autor skryptu wie że pliku tymczasowego potrzebuje, i mówię mu jak go stworzyć bez strzelania sobie w stopę.
Generalnie nie ze wszystkimi Twoimi uwagami się zgadzam, ale doceniam je i Twoją wiedzę. Myślę że fajnie by było gdybyś o części z nich napisał także w komentarzu do wpisu — wtedy czytelnicy będą mogli od razu się z nimi zapoznać.
Offline






Admin łajza







Ad 3.
azhag@debian:/tmp$ seq 1 100000 > plik.txt # sto tysięcy linii to chyba dostatecznie dużo ;)
azhag@debian:/tmp$ wc -l <plik.txt
100000
azhag@debian:/tmp$ time head -10 plik.txt| tail -1
10
real 0m0.008s
user 0m0.008s
sys 0m0.000s
azhag@debian:/tmp$ time awk 'NR == 10 {print}' plik.txt
10
real 0m0.118s
user 0m0.072s
sys 0m0.000s
azhag@debian:/tmp$ time sed -n 10p plik.txt
10
real 0m0.064s
user 0m0.040s
sys 0m0.004s
azhag@debian:/tmp$ time head -99999 plik.txt| tail -1
99999
real 0m0.042s
user 0m0.008s
sys 0m0.016s
azhag@debian:/tmp$ time awk 'NR == 99999 {print}' plik.txt
99999
real 0m0.113s
user 0m0.064s
sys 0m0.004s
azhag@debian:/tmp$ time sed -n 99999p plik.txt
99999
real 0m0.096s
user 0m0.052s
sys 0m0.000sJeszcze ciekawostka:
azhag@debian:/tmp$ cat skrypt
seq 1 100000 > plik.txt
head -10 plik.txt| tail -1
awk 'NR == 10 {print}' plik.txt
sed -n 10p plik.txt
head -99999 plik.txt| tail -1
awk 'NR == 99999 {print}' plik.txt
sed -n 99999p plik.txt
azhag@debian:/tmp$ time bash skrypt
10
10
10
99999
99999
99999
real 0m0.616s
user 0m0.420s
sys 0m0.032s
azhag@debian:/tmp$ time zsh skrypt
10
10
10
99999
99999
99999
real 0m0.579s
user 0m0.440s
sys 0m0.044s
azhag@debian:/tmp$ time dash skrypt
10
10
10
99999
99999
99999
real 0m0.552s
user 0m0.424s
sys 0m0.036sOstatnio edytowany przez azhag (2009-11-22 00:30:40)
Offline




Moderator Mamut
jedna uwaga co do LANG=C ... niekiedy zdecydowanie lepszy jest LC_MESSAGES=C ... np. wychwycenie linii o kasowaniu plikow z outputu rsync -v ... (przy LANG=C rozwala sie znaki UTF8 w nazwach plikow)
Offline




Użyszkodnik
bercik: Ale przecież od samego początku było napisane:
Problem w tym, że wyjście someprogram będzie odmienne w zależności od wartości zmiennej $LC_MESSAGES (ewentualnie $LANG), która określa w jakim języku mają być wyświetlane komunikaty.
Offline
Strony: 1