Šta je novo?

Pitanje o fajl deskriptorima i redirekciji

LaKosta

Slavan
Učlanjen(a)
20.06.2004
Poruke
457
Poena
319
Dakle imam dva fajla prvi je superheroes.txt
Kod:
$ cat superheroes.txt
Batman
Superman
Wonder Woman
Flash
Green Lantern
Hawkman

Drugi fajl je skripta filedesc.sh

Kod:
#!/bin/bash
# demo of reading and writing to a file using the file descriptor

exec 5<>"superheroes.txt"

while read -r superhero; do
    echo "Superhero name: $superhero"
done <&5

echo "File was read on: $(date)" >&5

exec 5>&-

Kada se skripta izvrši sve radi kako i očekujem
Kod:
$ ./filedesc.sh
Superhero name: Batman
Superhero name: Superman
Superhero name: Wonder Woman
Superhero name: Flash
Superhero name: Green Lantern
Superhero name: Hawkman
Međutim superheroes.txt nije onakav kakvog ga očekujem
Kod:
$ cat superheroes.txt
Batman
Superman
Wonder Woman
Flash
Green Lantern
Hawkman
File was read on: Sun Aug  7 12:09:13 CEST 2016

Zašto je 'echo "File was read on: $(date)" >&5' appendovao fajl umesto da ga prepiše kako sam očekivao?
 
U skrpiti nemas > koji bi usmerio echo output u while petlji.
Ako sam dobro shvatio ti hoces da prepises fajl iz kog citas varijable ? Nisam siguran da li to bas moze tako, mada iskreno nikad nisam koristio file decriptore u tu svrhu u skriptama, znas verovatno i sam da je za takve stvari sed najbolji :)
 
Pa ne može to tako :)
To ili moraš da koristiš varijable ili dva fajla ili da ispituješ da li line počinje sa "File was read on ...." i tu da onda staneš pa da zapišeš updejtovani text umesto tog lajna.
Nejasno je i da li planiraš da dodaješ nove super heroje ili je to to, ako je to fiksna lista onda je izvodljivo.
 
Nisam se očigledno dobro izrazio, ovaj while deo skripte radi baš ono što treba, iz jednog fajla čita red po red i onda to piše na ekranu preko STDOUT.
Ono što meni nije jasno je zašto ovaj deo 'echo "File was read on: $(date)" >&5' appenduje tu poruku na kraju tekstualnog fajla umesto da ga overwrituje.
Ono što sam ja naučio je da > overwrite a >> append, u ovom slučaju imamo samo jedan > pa on opet appenduje na kraju fajla.
 
Mašiš poentu ... taj tvoj primer čita taj fajl i na kraju dodaje echo "File was read on: $(date)" >&5
Kako očekuješ da radi overwrite fajla iz kojeg čita podatke ?
Koliko sam ja razumeo tebe ti bi da sadržaj ostane isti a da na kraju uvek bude samo jedan red "File was read ...." umesto nekoliko redova "File was read...."
Zaboravi overwrite i append, to u tvom primeru sa deskriptorima ne igra ulogu.
Znači morao bi prvo da sadržaj ili ubaciš u memoriju pa onda overwrite ili u tmp fajl pa onda sa njega u org file.
Tvoj program otvara fajl u read/write modu, čita sadržaj tog fajla i dodaje kada je pročitan, sledeći put kada ga pokreneš on opet dodaje liniju kada je pročitan i tako u krug.
Ili ja nisam razumeo... možda ti hoćeš da nakon čitanja tog fajla i ispisa na ekran sadržaj tog fajla bude obrisan, znači da nema više ništa unutra osim "File was read on ...." ?
 
Ili ja nisam razumeo... možda ti hoćeš da nakon čitanja tog fajla i ispisa na ekran sadržaj tog fajla bude obrisan, znači da nema više ništa unutra osim "File was read on ...." ?

Primer sam našao na (prilično lošem) kursu basha na linux akademiji. Nije da ja želim bilo šta nego očekujem da >&5 overwrite-uje fajl i da posle skripte u njemu bude samo "File was read....". A to se ne dešava a ja ne razumem zašto.
U svakom slučaju uspeo sam malo da izlolujem uzrok pojave.

Kod:
while read -r superhero; do
    echo "Superhero name: $superhero"
done [B]< superheroes.txt[/B] # ovde je ranije bilo [B]<&5[/B]

Kada se while petlja promeni da čita direktno iz txt fajla, a ne preko novog deskriptora onda se
Kod:
 echo "File was read on: $(date)" >&5
ponaša očekivano, odn. obriše sve u superheroes.txt i doda samo taj jedan red.

Očigledno da ne razumem baš kako bash radi sa fajlovima koje čita i piše, zato što se oni ne otvaraju i zatvaraju eksplicitno kao recimo u pajtonu.
Kod:
file=open('imefajla', 'rw')
file.close()
 
Poslednja izmena:
Vrh Dno