[LUGOS] bash - set -e

Egon Kocjan egon at krul.ath.cx
Fri Jul 6 10:35:50 CEST 2007


Splošno v smislu, da lahko rm zamenjaš za poljubno komando. Recimo da 
imamo a | b in da a teče dolgo - lahko se odločiš in killaš a, pa bo 
cela skripta crknila. Moj namen je bil namreč imeti Makefile-like 
skripto, torej:

set -e
abc
bbc
cbc
...

No in tečno mi je bilo, da takoj ko uporabim pipe, se začnejo exit 
statusi dejansko ignorirat. Hec tukaj je, da unix ima nekaj "avtomatike" 
- če pišeš v zaprt fd, ti proces privzeto crkne s signalom SIGPIPE. 
Ampak, če pa proces pisec umre "nenaravne" smrti (torej exit != 0, 
signalled...), pa za child procese to izgleda samo kot zaprt stdin. 
Shell recimo v določenih primerih ročno pobije child procese. Malo 
nekonsistentno...?

lp
egon

Blaz Podrzaj wrote:
> Uff, grdo. Ze moja varianta je grda ampak je definitivno bolj splosna 
> kot tale
> ;) No, kakor za koga. Pa 'set -e' ti tukaj prav tako nic ne koristi, 
> edino ce
> imas naprej v skripti kaksno simpl komando.
>
> lp,B
>
> Quoting Egon Kocjan <egon at krul.ath.cx>:
>
>> Hm, sem ?e malo razmi?ljal, pa sem zgruntal dokaj splo?no re?itev:
>>
>> set -e
>> pid=$$
>> (rm /kjkjdfkj || kill $pid) | cat
>>
>> lp
>> egon
>>
>>
>> Blaz Podrzaj wrote:
>>> Aha, v bistvu tebe muci tale -e (sem spregledal). Naceloma tale 'rm 
>>> x' je
>>> naceloma "Simple Command" ampak ta bi se morala koncati s control 
>>> operatorjem.
>>> Tvoja se ne, ker se nadaljuje v pipo in to ni vec "Simple Command" 
>>> ampak je ze
>>> "Pipeline" in tukaj ti -e nic ne pomaga. Ce bi delal redirekcijo v 
>>> file cemir
>>> bi se ti rad izognil bi -e funkcioniral ker se redirekcija smatra 
>>> kot del
>>> "Simple Command".
>>>
>>> Torej preostane ti tole spodaj -e pa ti v tem konkretnem primeru ne 
>>> koristi.
>>>
>>> lp,B
>>>
>>> Quoting Blaz Podrzaj <b at thz.net>:
>>>
>>>> Hoj,
>>>>
>>>> V tvojem drugem primeru teoreticno nic ni crknilo... ti si nekaj 
>>>> naredil in
>>>> STDOUT  tega kar si naredil stocil v cat. Dela! Prvi del pipe ni 
>>>> vrgel nic na
>>>> STDOUT, drugi del je pa ta nic cisto lepo pozrl in izpljunil dalje 
>>>> kar je OK.
>>>>
>>>> Rabis kvecjemu en pogoj v prvem delu ter 'exit 1' iz skripte.
>>>>
>>>> Tole bi bila "agli" resitev tocno za tvoj primer:
>>>>
>>>> ([ -f "xx" ]&&rm xx|cat||exit 1)||echo x
>>>>
>>>> ...vse kar je v oklepajih predstavlja tvojo skripto.
>>>>
>>>> lp,B
>>>>
>>>> Quoting Egon Kocjan <egon at krul.ath.cx>:
>>>>
>>>>> ?ivjo
>>>>>
>>>>> Recimo imam dve skripti:
>>>>>
>>>>> set -e
>>>>> rm /kjkjdfkj
>>>>>
>>>>> $ sh x.sh || echo x
>>>>> rm: cannot remove `/kjkjdfkj': No such file or directory
>>>>> x
>>>>> $
>>>>>
>>>>> To je ok primer.
>>>>>
>>>>>
>>>>> Zdaj pa bolj zanimiv primer:
>>>>>
>>>>> set -e
>>>>> rm /kjkjdfkj | cat
>>>>>
>>>>> $ sh x.sh || echo x
>>>>> rm: cannot remove `/kjkjdfkj': No such file or directory
>>>>> $
>>>>>
>>>>> Kako bi naredil, da bi celotna zadeva crknila, kljub temu da je 
>>>>> samo en
>>>>> del pipe izraza crknil. Rad bi se izognil pisanju v fajle, itd., 
>>>>> torej
>>>>> nekaj elegantnega. Pipe izrazi naj bi bili poljubno dolgi (ve?krat |)
>>>>>
>>>>> Lp
>>>>> egon
>>>>>
>>>>> _______________________________________________
>>>>> lugos-list mailing list
>>>>> lugos-list at lugos.si
>>>>> http://liste2.lugos.si/cgi-bin/mailman/listinfo/lugos-list
>>>>>
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> lugos-list mailing list
>>>> lugos-list at lugos.si
>>>> http://liste2.lugos.si/cgi-bin/mailman/listinfo/lugos-list
>>>>
>>>>
>>>
>>>
>>> _______________________________________________
>>> lugos-list mailing list
>>> lugos-list at lugos.si
>>> http://liste2.lugos.si/cgi-bin/mailman/listinfo/lugos-list
>>
>> _______________________________________________
>> lugos-list mailing list
>> lugos-list at lugos.si
>> http://liste2.lugos.si/cgi-bin/mailman/listinfo/lugos-list
>>
>>
>
>
> _______________________________________________
> lugos-list mailing list
> lugos-list at lugos.si
> http://liste2.lugos.si/cgi-bin/mailman/listinfo/lugos-list



More information about the lugos-list mailing list