tee stdout ke stderr?

17

Saya ingin mengirim stdout dari satu proses ke stdin dari proses lain, tetapi juga ke konsol. Mengirim stdout ke stdout + stderr, misalnya.

Sebagai contoh, saya mendapatkan git editalias sebagai berikut:

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

Saya ingin daftar nama file yang akan dikirim ke layar juga xargs.

Jadi, apakah ada teeutilitas seperti yang akan melakukan ini? Sehingga saya bisa melakukan sesuatu seperti:

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

Jawaban:

14

tee dapat menggandakan ke konsol saat ini dengan menggunakan tee /dev/tty

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

Secara alternatif, Anda dapat menggunakan /dev/stdoutatau /dev/stderrtetapi mereka dapat dialihkan jika perintah Anda ada dalam skrip. Catatan yang /dev/ttyakan selalu menjadi konsol (dan mungkin tidak ada di shell non-interaktif). Ini salah, baca komentar.

Vincent Robert
sumber
1
Memang, dalam pipa Anda menunjukkan /dev/stdout yang diarahkan. Artinya, jika Anda menggunakan tee /dev/stdoutefeknya adalah bahwa semuanya dikirim ke xargsdua kali, dan tidak ada yang masuk ke terminal.
celtschk
/dev/stdouttidak dialihkan oleh pipa, itu akan tetap pada output standar proses saat ini. Namun, jika Anda merangkum perintah dalam skrip dan kemudian mengarahkan stdout skrip ini, maka /dev/stdoutakan diarahkan. Di konsol interaktif, tee /dev/ttydan tee /dev/stdoutmemiliki efek yang sama, bahkan saat menggunakan pipa.
Vincent Robert
Jika Anda tidak percaya saya, mulai shell Anda dan ketik echo foo | tee /dev/stdout | tr f bdan echo foo | tee /dev/tty | tr f b. Inilah petunjuk untuk Anda: Ini adalah teeyang mengartikan /dev/stdoutnama file.
celtschk
2
Anda benar, saya tidak tahu bagaimana saya melewatkan itu. Saya melakukan beberapa tes di shell saya sendiri dengan tty dan stdout dan entah bagaimana saya melewatkannya. Terima kasih atas klarifikasi, saya menghapus pernyataan yang salah.
Vincent Robert
Nah, mengingat stderr tidak terpengaruh oleh pipa, Anda tidak perlu menghapus itu (tentu saja peringatan redirection script tetap, tetapi untuk script, redirectability umumnya akan menjadi properti yang diinginkan).
celtschk
4

Solusi yang lebih umum daripada /dev/tty:

start cmd:> echo foo | tee /dev/stderr 
foo
foo
Hauke ​​Laging
sumber
start cmd:> adalah Anda $PS1?
mgalgs
@mgalgs Bagian dari saya PS1, ya: hauke-laging.de/software/prompt (Jerman)
Hauke ​​Laging
3

Anda dapat menggunakan perintah tee , cukup beri makan dengan file STDERR, sebagai contoh:

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

jadi dalam hal ini alias Anda mungkin:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote
MolbOrg
sumber
1
Saya pikir maksud Anda/proc/self/fd/2
celtschk