tee stdout to stderr?


17

Chciałbym wysłać stdout z jednego procesu do stdin innego procesu, ale także do konsoli. Na przykład wysyłanie stdout do stdout + stderr.

Na przykład mam git editalias do następujących:

git status --short | cut -b4- | xargs gvim --remote

Chciałbym, aby lista nazw plików była wysyłana na ekran xargs.

Czy istnieje teenarzędzie podobne do tego? Aby móc zrobić coś takiego:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote

Odpowiedzi:


14

tee można powielić na bieżącej konsoli za pomocą tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

Alternatywnie możesz użyć /dev/stdoutlub /dev/stderrmogą zostać przekierowane, jeśli twoje polecenie znajduje się w skrypcie. Zauważ, że /dev/ttyzawsze będzie to konsola (i może nie istnieć w nieinteraktywnej powłoce). To źle, przeczytaj komentarze.


1
Rzeczywiście, w rurociągu pokażesz /dev/stdout jest przekierowany. Oznacza to, że jeśli użyjesz tee /dev/stdoutefektu, wszystko zostanie wysłane xargsdwukrotnie, a nic nie trafi do terminala.
— celtschk

/dev/stdoutnie jest przekierowywany przez potok, pozostanie bieżącym standardowym wyjściem procesu. Jeśli jednak zamkniesz polecenie w skrypcie, a następnie przekierujesz standardowe wyjście tego skryptu, /dev/stdoutnastąpi przekierowanie. W interaktywnej konsoli tee /dev/ttyi tee /dev/stdoutma ten sam efekt, nawet podczas korzystania z potoków.
— Vincent Robert

Jeśli mi nie wierzysz, uruchom swoją powłokę, wpisz echo foo | tee /dev/stdout | tr f bi echo foo | tee /dev/tty | tr f b. Oto podpowiedź dla Ciebie: jest to teeinterpretacja /dev/stdoutnazwy pliku.
— celtschk

2
Masz rację, nie wiem jak mi tego brakowało. Zrobiłem kilka testów we własnej powłoce z tty i stdout i jakoś mi tego brakowało. Dzięki za wyjaśnienie, usunąłem nieprawidłowe oświadczenie.
— Vincent Robert

Cóż, biorąc pod uwagę, że potok nie ma wpływu na stderr, nie musiałbyś tego usuwać (oczywiście zastrzeżenie dotyczące przekierowania skryptu pozostaje, ale w przypadku skryptu właściwość przekierowania byłaby na ogół pożądaną właściwością).
— celtschk


3

Możesz użyć polecenia tee , po prostu podaj plik STDERR, na przykład:

tee /dev/stderr
tee /proc/self/fd/2

więc w takim przypadku Twój alias może:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote

1
Myślę, że masz na myśli/proc/self/fd/2
— celtschk
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.