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

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.


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


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

1
Saya pikir maksud Anda/proc/self/fd/2
celtschk
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.