`tee` untuk perintah

15

teedapat mengarahkan input standar yang disalurkan ke output dan file standar .

echo Hello, World! | tee greeting.txt

Perintah di atas akan menampilkan salam pada layar terminal dan menyimpannya dalam isi greeting.txtfile, membuat file jika tidak ada dengan nama itu.

Ada juga yang -aberalih untuk teemenambahkan file yang sudah ada alih-alih menimpa.


Apakah ada cara yang mudah untuk mengarahkan input yang disalurkan ke perintah dan output standar alih-alih file?

Saya mencoba membuat skrip pembungkus untuk bukumenyalin ke pemilihan utama, URL bookmark yang ditentukan oleh nomor indeksnya.

# bukuc:
#!/bin/sh
url=$(buku -f 1 -p $1 | cut -f 2) # NUMBER : URL
echo $url # DISPLAY
echo $url | xsel # PRIMARY SELECTION

Di sini saya menggunakan echo dua kali, pertama untuk ditampilkan di terminal, dan kemudian menyimpan dalam pemilihan utama (clipboard).

Saya membayangkan sesuatu echo $url | teeC xselatau cara pintas untuk menampilkan output sebelum meneruskan ke perintah berikutnya (perintah chaining), apa yang akan memungkinkan saya untuk rantai seluruh perintah dalam satu baris tanpa perlu menyimpan hasil dalam variabel sebagai berikut:

buku -f 1 -p $1 | cut -f 2 | teeC xsel    

Saya juga dapat menggunakannya dengan urlviewuntuk melihat, memilih, dan membuka dengan yang $BROWSERberikut:

bukuc 10-20 | urlview

sumber
3
Coba tee /dev/ttyatau tty0(tidak ingat persis ... saya di jalan)
George Vasiliou
2
info teemenyebutkan penggantian proses, dan menyalurkan output tee ke sebuah program ...
Xen2050

Jawaban:

19

Ini mudah di shell yang mendukung substitusi proses , misalnya bash

$ echo foo | tee >(xsel)
foo
$ xsel -o
foo

Kalau tidak, Anda bisa menggunakan FIFO (meskipun tidak nyaman)

$ mkfifo _myfifo
$ xsel < _myfifo &
$ echo bar | tee _myfifo
bar
$ xsel -o
bar
[1] + Done                       xsel 0<_myfifo
$ 
Steeldriver
sumber
Terima kasih! Dua hal yang saya catat: 1. sh(Bourne shell) tidak mendukung fitur itu; 2. Panah harus menempel sebagai bagian dari operator tunggal >()untuk penggantian proses.
11

Analog langsung "tee for commands" adalah peeperintah dari moreutils ( tee, tetapi dengan pipa). Argumennya digunakan sebagai perintah untuk dijalankan, bukan sebagai jalur, dan mereka mendapatkan input yang disalurkan ke mereka daripada ditulis ke file. Semua perintah diberi input standar yang Anda gunakan peesebagai milik mereka.

Dengan menggunakan pee, Anda bisa mendapatkan hasil yang Anda inginkan dengan menyuruhnya menjalankan keduanya xseldan catdengan input.

echo foo | pee xsel cat

Ada catproses tambahan yang mengambang di sana untuk melakukan output, yang sebenarnya bukan masalah untuk use case Anda tetapi bisa jadi kurang ideal di lain waktu. Ini bekerja dengan shell apa pun, tidak seperti substitusi proses, tetapi tentu saja ia membutuhkan alat tambahan (mungkin kurang umum) yang diinstal.

Anda dapat memberikan lebih banyak perintah kompleks dengan mengutip mereka: pee "xsel --display :1" cat. Mereka dijalankan dengan sh, jadi Anda harus berhati-hati tentang karakter meta shell.

Michael Homer
sumber
4
Sangat keren - tidak tahu tentang itu
steeldriver
2
Itu ... bukan nama yang bagus.
David Richerby