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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2009-11-21 22:32:18

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Popularne błędy popełniane podczas pisania skryptów powłoki

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:

Kod:

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/


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#2  2009-11-21 22:34:02

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

Czekam na piękne kobiety, drogie alkohole i szybkie samochody.
;)

Offline

 

#3  2009-11-21 22:35:13

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

Minio napisał(-a):

Czekam na piękne kobiety, drogie alkohole i szybkie samochody.
;)

A mogą być szybkie kobiety, drogie alkohole i piękne samochody?? ;)


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#4  2009-11-21 22:40:43

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

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 ;)

;)


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#5  2009-11-21 22:56:19

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

Pozwolę sobie zauważyć, że alkohol nie musi być piękny, ważne żeby poniewierał ;)


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#6  2009-11-21 23:00:36

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

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

Offline

 

#7  2009-11-21 23:03:02

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

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)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#8  2009-11-21 23:07:50

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

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

Kod:

grep -m 1 fraza plik.txt >/dev/null 2>&1

jest jeszcze mniej KISS.

Ostatnio edytowany przez azhag (2009-11-22 00:20:21)


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#9  2009-11-21 23:30:33

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

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

 

#10  2009-11-22 00:12:54

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

Ad 3.

Kod:

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.000s

Jeszcze ciekawostka:

Kod:

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.036s

Ostatnio edytowany przez azhag (2009-11-22 00:30:40)


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#11  2010-06-12 02:17:00

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

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)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#12  2010-06-13 15:40:45

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: Popularne błędy popełniane podczas pisania skryptów powłoki

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

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)