Chcete zlepšit tuto otázku? Přidejte podrobnosti a objasněte problém úpravou tohoto příspěvku.
Zavřeno před 4 lety.
Vylepšete tuto otázku
Poté, co jsem narazil na asi 3 tee
vysvětlení, která považuji za nedidaktická, požádal bych o jednoduché, obecné a stupňovité (pokud možno) vysvětlení tohoto příkazu, určeného pro nováčky v Linuxu.
Chápu, že jej používáme buď prostřednictvím kanálu, na stdout příkazu, nebo alternativně přímo k určitému souboru, ale myslím, že mi uniká, co vlastně příkaz s tímto obsahem dělá a kdy je užitečný.
Takže tady je to, na co se ptám v naději, že najdu didaktické vysvětlení, podané nováčkům jasným a stupňovitým způsobem:
-
Jak příkaz funguje buď se stdout příkazu, nebo případně se soubory samotnými?
-
Proč je běžné říkat
tee
čte standardní vstup? Myslím, když udělámls -l
,tee
nečte syntaxils -l
sám, ale spíše stdout, který vytiskl do relace.
Pokud chcete, podělte se také o praktický příklad z vaší každodenní práce, kdy tee
je pro vás velmi užitečný?
Přijatá odpověď:
Z tee
manuál v mém systému:
Obslužný program tee zkopíruje standardní vstup na standardní výstup a vytvoří kopii
v žádném nebo více souborech. Výstup je bez vyrovnávací paměti.
Čte tedy ze standardního vstupu a kopíruje jej na standardní výstup a přitom také duplikuje stream do jednoho nebo několika souborů.
V následujícím kanálu tee
vezme výstup prvního příkazu v potrubí a zkopíruje ho na standardní výstup (terminál) a zároveň vytvoří jeho kopie v souborech one
, two
a three
:
$ somecommand | tee one two three
tee
má mnoho použití, jedno je ve spojení s sudo
k přesměrování výstupu do souboru vlastněného uživatelem root:
$ somecommand | sudo tee /root/somefile >/dev/null
Následující by nebylo fungovaly, protože k přesměrování dojde jako neprivilegovaný uživatel (také by spustil somecommand
jako root, který může být nežádoucí):
$ sudo somecommand >/root/somefile
Umělý příklad připojení pevné sady řádků k mnoha souborům najednou (všem uživatelům ~/.profile
soubory, za předpokladu, že *
expanduje na uživatelská jména a že rozbalený příkazový řádek nebude příliš dlouhý na to, aby jej shell zvládl):
$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH
Skutečný příklad použití tee
:
time doas box-build.sh 2>&1 | tee build.out | grep '^=*>'
Toto jsem já, když budují základní systém OpenBSD. doas
je OpenBSD „ekvivalent“ sudo
a box-build.sh
je malý shell skript, který provádí stavbu (v podstatě cd /usr/src && make obj && make build
). Rád bych si uložil výstup celého procesu sestavování, včetně případných chyb nebo varování, ale nechci, aby všechno chrlilo ven do mého terminálu. K tomuto účelu používám tee
vše uložit do build.out
a poté grep
získat pouze náznak toho, kde se v tomto procesu v terminálu nacházíme.