it-swarm-eu.dev

jak přesměrovat výstup do více souborů protokolu

Jak přesměrovat standardní výstup na více souborů protokolu? Následující nefunguje:

some_command 1> output_log_1 output_log_2 2>&1
55
doubledecker

Viz man tee:

NAME: tee - čtení ze standardního vstupu a zápis na standardní výstup a soubory

SYNOPSIS: tee [OPTION] ... [FILE] ...

Podle toho:

echo test | tee file1 file2 file3
73
akond

Řekněme, že váš výstup je generován funkcí, cmd():

cmd() {
    echo hello world!
}

Chcete-li přesměrovat výstup z cmd na dva soubory, ale ne na konzolu, můžete použít:

cmd | tee file1 file2 >/dev/null

To bude fungovat pro více souborů, vzhledem k tomu, že potrubí zdroje dat k odpališti:

echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null

To bude také fungovat:

echo $(cmd) | tee file1 file2 >/dev/null

Bez přesměrování /dev/null, Tee odešle výstup do stdout navíc k zadaným souborům.

Pokud je například spuštěn z konzoly, uvidíte výstup tam. Při spuštění z crontabu se na výstupu zobrazí stavová zpráva, která vám bude zaslána poštou (viz také Gillesova odpověď zde https://unix.stackexchange.com/a/100833/3998 ).

Toto pro mě fungovalo v bashu na Ubuntu 12.04 a bylo ověřeno v Ubuntu 14.04 pomocí GNU bash 4.3.11 (1), takže by mělo fungovat na jakékoli nedávné GNU bash verzi.

13
K. P. MacGregor

Je to starý příspěvek, ale právě jsem ho našel ...

Namísto přesměrování výstupu na > /dev/null můžete jej přesměrovat na poslední soubor:

echo "foobarbaz" | tee file1 > file2

Nebo pro připojení výstupu:

echo "foobarbaz" | tee -a file1 >> file2
10
James Cook

Jak @jofel zmínil v komentáři pod odpovědí, lze to udělat nativně v zsh:

echo foobar >file1 >file2 >file3

nebo, s rozšířením vzpěry:

echo foobar >file{1..3}

Interně to funguje velmi podobně jako výše uvedené odpovědi tee. Shell spojuje stdout příkazu s procesem, který vede k více souborům; proto není žádná přesvědčivá technická výhoda, jak to udělat tímto způsobem (ale vypadá opravdu dobře). Další informace viz zsh manuál .

5
strugee

Nelze však vyjádřit jiný způsob vyjádření

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

Mohlo by se to zjednodušit při práci s mnoha soubory.

echo "foobarbaz" | tee file{1..8} > /dev/null
2
user149146