Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: timmynovak 21 Listopadu 2011, 15:42:32

Název: jak pomocí tail naplnit v shellu proměnnou? [vyřešeno]
Přispěvatel: timmynovak 21 Listopadu 2011, 15:42:32
Ahoj, potřeboval bych zpracovávat nové přírůstky ze syslog, které běžně vidím pomocí:
Kód: [Vybrat]
tail -f /var/log/syslog
ale nemohu příjít na to, jak bych třeba ve skriptu a cyklu mohl postupně do proměnné načítat to, co tail vrací a s tím pak něco dělat. Je to asi kravinka, ale ne a ne na to přijít:( Díky za rady či ukázkové příklady.
Název: Re:jak pomocí tail naplnit v shellu proměnnou?
Přispěvatel: Šuohob 21 Listopadu 2011, 15:51:15
Kód: [Vybrat]
promenna="$(tail -f /var/log/syslog)"
Název: Re:jak pomocí tail naplnit v shellu proměnnou?
Přispěvatel: Kedrigern 21 Listopadu 2011, 15:59:35
Předchozí řešení je dobré, ale tuším, že funguje jen v modernějších shellech. IMHO klasické je použít:
Kód: [Vybrat]
`command`což vrátí výstup příkazy (spustí si to subshell a zkopíruje výstup), čili můžeš udělat:
Kód: [Vybrat]
x=`command`
Ale pokud to nepíšeš pro nějaký prehistorický systém, tak použij předchozí odpoveď. Tohle postuji tak pro info :).
Název: Re:jak pomocí tail naplnit v shellu proměnnou?
Přispěvatel: timmynovak 21 Listopadu 2011, 16:19:49
děkuji
Název: Re:jak pomocí tail naplnit v shellu proměnnou?
Přispěvatel: daysleeper 21 Listopadu 2011, 20:41:42
děkuji
Jak jsi to tedy vyřešil? Mně žádné z uvedených řešení nefunguje: `tail -f` se musí zabít, aby se ukončil.
Název: Re:jak pomocí tail naplnit v shellu proměnnou?
Přispěvatel: Šuohob 21 Listopadu 2011, 21:18:22
děkuji
Jak jsi to tedy vyřešil? Mně žádné z uvedených řešení nefunguje: `tail -f` se musí zabít, aby se ukončil.

Kód: [Vybrat]
-f, --follow[={name|descriptor}]
              output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent

cili ten tail proste bude neustale bezet, protoze ceka na prirustek souboru, aby ho mohl vypsat


EDIT: ted koukam, ze to do te promenne nezapisuje. vi nekdo proc?
Název: Re:jak pomocí tail naplnit v shellu proměnnou?
Přispěvatel: GdH 21 Listopadu 2011, 21:31:53
EDIT: ted koukam, ze to do te promenne nezapisuje. vi nekdo proc?

Zapisuje, ale teprve až sejmeš ten proces, můžeš proměnnou přečíst. Resp. proměnná se vytvoří, až bude kompletní obsah.
V zásadě jde o to, že spustíš subshell, který něco tvoří a teprve až skončí, výsledek se přesune do proměnné.
Název: Re:jak pomocí tail naplnit v shellu proměnnou?
Přispěvatel: daysleeper 21 Listopadu 2011, 21:36:35
Takže bych v bashi musel periodicky načítat celý soubor (nebo zabíjet `tail`, jenže pak by `tail -f` ztrácelo veškerý smysl) a dále sledovat nějaký marker kde jsem v souboru skončil, abych zjistil, co nového se mi načetlo.

Existuje nějaké čistší řešení?
Název: Re:jak pomocí tail naplnit v shellu proměnnou?
Přispěvatel: timmynovak 21 Listopadu 2011, 23:10:39
aaaha, tak mi to fakt nefunguje:(
Název: Re:jak pomocí tail naplnit v shellu proměnnou?
Přispěvatel: daysleeper 21 Listopadu 2011, 23:25:31
Možná by ti stačilo něco jako
Kód: [Vybrat]
tail -f /var/log/syslog | while read line; do echo $line; done
nový řádek je vždy v proměnné line.
Název: Re:jak pomocí tail naplnit v shellu proměnnou?
Přispěvatel: timmynovak 22 Listopadu 2011, 20:03:37
skvělé, děkuji, funguje to přesně tak, jak jsem potřeboval, děkuji!