Portál AbcLinuxu, 3. června 2024 01:17


Dotaz: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly

7.8.2020 17:18 GeorgeWH | skóre: 42
Presmerovanie stdout len do suboru a stderr do suboru aj konzoly
Přečteno: 391×
Odpovědět | Admin
Zdravim.

Uz sa s tym piplam dve hodiny a nic. Mam sh (nie bash) skript, ktoreho standardny a error vystup chcem ulozit do suboru a zaroven na konzolu vypisat len error hlasky. Skusal som kadejake variacie s exec, ale stale som mal bud vsetko v konzole a prazdny subor alebo naopak alebo nikde nic...

Najlepsie by bolo, keby bolo vsetko vyriesene v skripte, ale uspokojil by som sa aj s variantou, ked by napr. ./moj-skript.sh >/dev/null do konzoly vypisal len chybu a do suboru vsetko a ./moj-skript.sh by vypisal vsetko do konzoly aj suboru.

Skript moj-skript.sh:
#!/bin/sh
#

# nejako nastavene presmerovanie stdout a stderr do suboru moj-skript.log
# a zaroven presmerovanie stderr na konzolu
???

/bin/ls /etc/fstab
/bin/ls /nonexists
Vystup skriptu
$ ./moj-skript.sh
ls: /nonexists: No such file or directory
Obsah log suboru moj-skript.log
/etc/fstab
ls: /nonexists: No such file or directory
Vdaka.

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

xkucf03 avatar 7.8.2020 17:48 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly
Odpovědět | | Sbalit | Link | Blokovat | Admin

Tohle dělá, co chceš:

#!/bin/sh

funkce() {
	/bin/ls /etc/fstab
	/bin/ls /nonexists
}


mkfifo out.fifo
mkfifo err.fifo
mkfifo xxx.fifo

cat out.fifo > xxx.fifo &
cat err.fifo | tee xxx.fifo &
cat xxx.fifo > xxx.log &

funkce 1> out.fifo 2> err.fifo

wait
wait
wait

rm -f out.fifo err.fifo xxx.fifo

Ale nelíbí se mi to, říkám si, že by to mělo jít jednodušeji…

Navíc je tam problém s úklidem při nějaké chybě a s tím, že se ti můžou zprávy zapsané do STDOUT a STDERR prolnout.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
7.8.2020 19:32 GeorgeWH
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly
Ten ls bol len na demonstraciu pozadovaneho vysledku. Robit taketo upravy je dost nerealne.
xkucf03 avatar 7.8.2020 20:58 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly

Pak asi tohle: #4, případně tam ještě přidat ten sed z #7.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
7.8.2020 17:49 pavele
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly
Odpovědět | | Sbalit | Link | Blokovat | Admin
tee
xkucf03 avatar 7.8.2020 17:58 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly

Můžeš to rozvést?

V Bashi jde dosadit proces místo cesty k souboru, otázka je, jak ty výstupy pak zase spojit do jednoho… Možná nějak adaptovat tenhle příklad… ale tohle jsou docela zběsilosti – do toho článku jsem to dával spíš jako odstrašující příklad :-)

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
xkucf03 avatar 7.8.2020 18:12 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly

P.S. Tak trochu funguje tohle:

funkce 2> >(tee -a xxx.log) >> xxx.log

ale nelíbí se mi ten zápis do jednoho souboru ze dvou procesů bez jakékoli synchronizace…

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
7.8.2020 19:17 jejda | skóre: 24 | blog: jejda
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly
Odpovědět | | Sbalit | Link | Blokovat | Admin
Taky si můžeš ten error z logu jednoduše grepnout.
#!/bin/sh
log=moj-skript.log
for file in /etc/fstab /nonexists; do
  /bin/ls $file >> $log 2>&1
  tail -1 $log | grep "^/bin/ls: "
done
7.8.2020 19:54 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly
Odpovědět | | Sbalit | Link | Blokovat | Admin
( ./moj-skript.sh 2> >( tee /dev/stderr ) | sed '' ) > moj-skript.log
Ten sed zajišťuje bufferování řádku podobné tomu, které se používá u výstupu na terminál. stderr zůstává stderr.
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
7.8.2020 21:45 GeorgeWH | skóre: 42
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly
Vysledok je ok, ale potreboval by som to dostat priamo do toho skriptu, aby ho jednoducho stacilo spustit a aby to bolo hlavne blbovzdorne.
Jendа avatar 7.8.2020 22:07 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly
Jsem zagůglil bash replace stdout of current script a první odkaz říká že by na začátku mělo jít udělat exec a>b a to efektivně změní všechen výstup skriptu.

A před tím první, co mě napadlo bez googlení, bylo napsat si modul do bashe, který nahradí file deskriptory 1 a 2, a zavést ho pomocí enable -f :-D
xkucf03 avatar 7.8.2020 22:16 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly

Ten exec se normálně používá, ale problém je, že on tady chce STDERR rozdvojit, jednou ho poslat na terminál a jednou ho spojit s STDOUT a společně poslat do souboru.

V tom modulu bys musel řešit to samé – číst současně ze dvou FD a data z jednoho posílat na terminál a data z obou posílat do souboru.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
Řešení 1× (GeorgeWH (tazatel))
7.8.2020 22:09 GeorgeWH | skóre: 42
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly
Tak uz to mam, stacilo to supnut do skriptu a nie je to az take zle. Akurat to funguje len v bash-i, ale tak co uz (vsetky skripty sa snazim pisat v shell-i):
#!/bin/bash
#

(

echo "INFO: log iba do suboru"
ls /etc/fstab

echo "ERROR: log do suboru aj na konzolu" >&2
ls /nonexists

echo "INFO: log iba do suboru"

echo "ERROR: log do suboru aj na konzolu" >&2

) 2> >( tee /dev/stderr ) | sed '' > moj-skript.log
Vdaka.
xkucf03 avatar 7.8.2020 22:26 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Presmerovanie stdout len do suboru a stderr do suboru aj konzoly

Případně se to ještě řeší tak, že na začátek skriptu dáš IF, ve kterém zkontroluješ nějakou proměnnou, pokud není nastavená, tak ji nastavíš a spustíš sám sebe s tím přesměrováním:

#!/bin/bash

if [ -z "$XXX" ]; then
	export XXX=x;
	echo "spouštím s přesměrováním";
	"$0" "$@" &>1;
fi

echo "původní skript";
echo "parametry: " "$@";

Tohle se hodí i v případě, že potřebuješ potřebuješ třeba přepsat nebo doplnit nějaké CLI parametry.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.