da stdout a stderr?


17

Vorrei inviare stdout da un processo allo stdin di un altro processo, ma anche alla console. Invio stdout a stdout + stderr, ad esempio.

Ad esempio, ho una git editaliasing per quanto segue:

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

Vorrei che anche l'elenco dei nomi dei file fosse inviato sullo schermo xargs.

Quindi, c'è teeun'utilità simile a quella che farà questo? In modo che io possa fare qualcosa del tipo:

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

Risposte:


14

tee può duplicare sulla console corrente usando tee /dev/tty

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

In alternativa, è possibile utilizzare /dev/stdouto /dev/stderrma potrebbero essere reindirizzati se il comando si trova all'interno di uno script. Nota che /dev/ttysarà sempre la console (e potrebbe non esistere in una shell non interattiva). Questo è sbagliato, leggi i commenti.


1
In effetti, nella pipeline che mostri /dev/stdout viene reindirizzato. Cioè, se si usasse tee /dev/stdoutl'effetto sarebbe che tutto viene inviato a xargsdue volte e nulla va al terminale.
Celtschk,

/dev/stdoutnon viene reindirizzato da una pipe, rimarrà l'output standard del processo corrente. Tuttavia, se si incapsula il comando in uno script e si reindirizza lo stdout di questo script, /dev/stdoutverrà reindirizzato. In una console interattiva, tee /dev/ttye tee /dev/stdoutha lo stesso effetto, anche quando si usano le pipe.
Vincent Robert,

Se non mi credi, avvia la shell e digita echo foo | tee /dev/stdout | tr f be echo foo | tee /dev/tty | tr f b. Ecco un suggerimento per te: è quello teeche interpreta il /dev/stdoutnome del file.
Celtschk,

2
Hai ragione, non so come mi sia perso. Ho fatto alcuni test nella mia shell con tty e stdout e in qualche modo mi mancava. Grazie per il chiarimento, ho rimosso la frase sbagliata.
Vincent Robert,

Bene, dato che lo stderr non è influenzato dalla pipe, non avresti bisogno di rimuoverlo (ovviamente rimane il caveat di reindirizzamento dello script, ma per uno script, la redirectability sarebbe generalmente una proprietà desiderata).
Celtschk,


3

Puoi usare il comando tee , basta alimentarlo con il file STDERR, come esempio:

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

quindi in quel caso il tuo alias forse:

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

1
Penso che intendi/proc/self/fd/2
Celtschk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.