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
Roger Lipscombe
źródło

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.

Vincent Robert
źródło
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
4

Bardziej ogólne rozwiązanie niż /dev/tty:

start cmd:> echo foo | tee /dev/stderr 
foo
foo
Hauke ​​Laging
źródło
start cmd:> jest Twoja $PS1?
mgalgs,
@mgalgs Część mojego PS1, tak: hauke-laging.de/software/prompt (niemiecki)
Hauke ​​Laging
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
MolbOrg
źródło
1
Myślę, że masz na myśli/proc/self/fd/2
celtschk