bufrovani v roure

Peter Kruty (oozy) xkruty na informatics.muni.cz
Sobota Červen 15 21:29:24 CEST 2002


On Sat, Jun 15, 2002 at 12:09:59PM +0200, Pavel Kankovsky wrote:
> On Fri, 14 Jun 2002, Peter Kruty (oozy) wrote:
> 
> >     Nie je to velmi pekne, ale mozte pouzit prikaz 'tac':
> >     tr 'A' 'B' < soubor.txt | tac | tac > soubor.txt
> 
> Nemyslim, ze by tohle fungovalo, protoze posledni presmerovani (>)
> soubor.txt prepise jeste driv, nez tr skonci s jeho ctenim. U maleho
> souboru to muze projit (tr staci cely obsah nasat do svych bufferu, nez
> se obsah prepise), u velkeho uz tezko.

    No mam dva argumenty preco sa mylite :). Prvy - program 'tac' vypisuje
svoj vstup v obratenom poradi, teda logicky ho musi najprv cely nacitat (v
pripade stdin, nie nutne pokial cita zo suboru) a potom od konca zacat
vypisovat.

    Druhy - pozeral som zdrojove kody programu 'tac' a skutocne to tak
robi. Pokial cita vstup z stdin, tak nacita cely vstup ten si ulozi, otoci
a potom zase vypise na stdout. (textutils-2.0/src/tac.c)

> Spravne reseni (pro jednoduchost bez osetreni chybovych stavu) by bylo
> asi nasledujici (neotestovano):
> 
>   tr 'A' 'B' < soubor.txt | \
>   ( t=`mktemp /tmp/tXXXXXX`; cat > $t; cat < $t > soubor.txt; rm $t )

    Prave tomu temp-suboru sa chceme vyhnut.

regards,
    oozy

-- Peter Kruty
--
#!/bin/bash -- require: bash gcc perl guile
perl -we "\$_ =\`guile -c '(display (list->string (reverse (\
string->list \\\"\$ARGV[0]\\\"))))'\`;sub{print}->(s/zoo/alh\
\n/i)" `echo "char a[]=\"Oozy\\n\";int main(){char*i;for(i=a\
;*i!=0;i++)putchar(0[i]);}"|cc -x c - -o $$&&./$$&&rm -f $$`;


Další informace o konferenci Linux