Saya ingin menyalurkan output standar suatu program sambil menyimpannya di layar.
Dengan contoh sederhana ( echo
gunakan di sini hanya untuk tujuan ilustrasi):
$ echo 'ee' | foo
ee
<- output yang ingin saya lihat
Saya tahu tee bisa menyalin stdout ke file tetapi bukan itu yang saya inginkan.
$ echo 'ee' | tee output.txt | foo
Saya mencoba
$ echo 'ee' | tee /dev/stdout | foo
tetapi tidak berhasil karena tee output /dev/stdout
disalurkan kefoo
echo 'ee' | tee /dev/stderr
berfungsi, jadi jika persyaratan "di layar" Anda dipenuhi oleh stderr juga, itu bisa dilakukan.Jawaban:
Berikut ini adalah solusi yang berfungsi pada implementasi Unix / Linux, dengan asumsi itu mengikuti
POSIX
standar. Ini berfungsi pada beberapa lingkungan non Unixcygwin
juga.Referensi: Spesifikasi Basis Grup Terbuka Edisi 7 IEEE Std 1003.1, 2013 Edisi, §10.1 :
Beberapa lingkungan seperti Google Colab telah dilaporkan tidak menerapkan
/dev/tty
sementara masih memilikitty
perintah mereka mengembalikan perangkat yang dapat digunakan. Berikut ini solusinya:atau dengan cangkang Bourne kuno:
sumber
/dev/tty
adalah perangkat Unix wajib. Apakah Anda menjalankan di penjara BSD?tee
seperti ini:cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.log
ke 1) mendapatkan semuanya ke konsol, 2) mendapatkan semuanya ditambahkan ke file lain, 3) mendapatkanfoo
baris ke file yang berbeda./dev/tty
, tetapi outputtty
dapat digunakan.Hal lain untuk dicoba adalah:
Ini
>(foo)
adalah proses substitusi .sumber
foo
harus menjadi bagian dari proses substitusi. Ini sebuah contoh:echo 'ee' | tee file.txt >(wc -c | tr -d ' ')
echo 'ee' | tee >(cat) | foo | bar
.Akses ke "/ dev / stdout" ditolak pada beberapa sistem, tetapi akses ke terminal pengguna diberikan oleh "/ dev / tty". Menggunakan "wc" untuk "foo", contoh di atas berfungsi OK (di linux, OSX, dll.) Sebagai:
Untuk menambahkan hitungan di bagian bawah daftar file yang cocok, saya menggunakan sesuatu seperti:
% ls [A-J]* | tee /dev/tty | wc -l
Untuk menghindari harus mengingat semua ini, saya mendefinisikan alias:
% alias t tee /dev/tty
% alias wcl wc -l
jadi saya bisa mengatakan:
% ls [A-J]* | t | wcl
sumber
Mencoba:
Jika menggunakan stderr adalah suatu pilihan, tentu saja.
sumber
pertama-tama Anda harus mencari tahu terminal yang terkait dengan layar Anda (atau layar mana pun yang Anda inginkan untuk menampilkannya):
maka Anda dapat mem-tee output ke terminal itu dan mengirimkan salinan lainnya melalui program foo Anda:
sumber
t
tidak berguna. Anda dapat menggunakanecho ee | tee $(tty) | foo
tetapi masih memiliki perintah tidak berguna (tty
), mengingat fakta itu/dev/tty
hanya berfungsi.