U ovom slucaju nije. Naime, koristenje pipe podrazumijeva pravljenje vise procesa, pri cemu svi ti procesi normalno imaju jednak prioritet izvrsenja. Osim toga, redoslijed kojim shell pravi sve te potprocese razlikuje se od shell-a do shell-a. U slucaju
$ cat datoteka | cat >datoteka
postoje dva potprocesa, i dva poziva sistemske rutine open (jednom za citanje i jednom za pisanje). Posto oba procesa imaju isti prioritet izvrsenja, ovo nije nista drugo nego race-condition. Ukoliko prvi proces prvi otvori datoteku za citanje, procitace u svoj bafer koliko moze (moja verzija cat-a ima bafer od 8 kB). Nakon toga, drugi proces (shell) otvori datoteku sa flagom O_TRUNC i unisti njen sadrzaj. Sve sto je ostalo jeste sadrzaj bafera prvog procesa, sto se kroz pipu predaje na stdin drugog procesa i (u ovom slucaju) na kraju zapisuje u datoteku. Dakle, 8 kB u mom slucaju ili 16 kB u keskovom. Ako, pak, drugi proces prvi uspije pozvati open(2), rezultat ce biti prazan fajl. Probaj ovo:
$ nice cat datoteka | cat >datoteka
Nakon dovoljnog broja pokusaja trebao bi dobiti fajl velicine 0. Ako ti to ne uspije, dodaj jos nice-ova ispred cat-a!
Sto se tice rjesenja za tvoj problem, mozes koristiti perl sa opcijom -i, koja vrsi promjene in-place bez koristenja temp fajla. Takodje, neke verzije sed-a imaju ovu opciju (konkretno GNU sed). Ovako bi to izgledalo sa perl-om:
$ perl -i -p -e 'BEGIN { $l = 0 } ++$l and s/^/$l: /' datoteka
U ovom slucaju ne moras koristiti nl, ali moras znati bar neke osnove perl-a, sto komplicira cijeli problem i ide u sasvim drugom pravcu. Ako radis sa shell-om, uobicajeno je da koristis temp fajlove, ali ako bas inisistiras, Bourne-like shell-ovi mogu i bez temp fajlova:
$ exec 3<datoteka && rm -f datoteka && nl -s ': ' <&3 >datoteka
Zao mi je sto nemam vise vremena da ti napisem kako ovo radi, ali mogu bar reci da je princip potpuno isti kao kod perl-ove -i opcije. Mislim da sam negdje na ovom forumu vec napisao nesto o tome (kljucna rijec unlink). Koristenje komande rm je nuzno, jer se rm upravo zasniva na sistemskoj rutini unlink. Probaj uraditi isto bez rm ([color=red]naravno, na nekom testnom fajlu[/color] :)!