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.