Melakukan dua hal dengan output dari sebuah perintah


9

Saya memiliki program texcountyang menampilkan jumlah kata dalam dokumen LaTeX saya. Saya juga dapat mem-pipe output ini untuk sedmembuat baris baru TeX linebreaks dan menulis ini ke file yang kemudian dapat saya sertakan dalam dokumen terakhir saya. Tetapi ketika saya melakukan texcount foo.tex | sed s/$/'\\\\'/ > wc.texoutput perintah baris texcountditekan.

Bagaimana saya bisa mendapatkan output dari perintah pertama yang akan ditampilkan di terminal dan disalurkan ke sed?

Jawaban:


9

Anda dapat menggunakan pipa anonim untuk perintah kedua:

texcount foo.tex | tee >(sed s/$/'\\\\'/ > wc.tex)

Bagian penting dari jawaban ini adalah menggunakan tee. Jika Anda memiliki cangkang tertentu seperti Bash, Anda dapat menyalurkan output tee menggunakan >(some further commands). Di shell lain, Anda harus memberikan tee argumen nama file (ini adalah mode operasi standarnya), kemudian jalankan some further commands < thatfile, dan kemudian hapus file itu. Atau lihat jawaban Hari di bawah ini.
dubiousjim

tee, tee & tee.
bagavadhar

7

Anda memerlukan perintah "tee", yang memungkinkan Anda untuk membagi pipa.

texcount foo.tex | tee >output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt

Ini akan meninggalkan Anda file output.txt tambahan. Baca ini untuk info lebih lanjut: http://www.unixtutorial.org/2007/12/tee-replicate-standard-output/ Anda juga dapat melakukan "man tee".


texcount foo.tex | tee unmodified |sed s/$/'\\\\'/ > modifiedmenempatkan versi output yang dimodifikasi dan tidak dimodifikasi dalam dua file. Bagaimana cara mencetak versi yang tidak dimodifikasi ke terminal? Saya mencoba tee stdouttetapi tidak mencetak apa-apa ...
Seamus

3
Anda tidak dapat melakukan itu, karena tee mengirimkan inputnya ke stdout dan file. Stdout inilah yang menjadi input bagi sed. Anda bisa menambahkan && cat unmodifieddi bagian akhir. Itu akan membuang output yang tidak dimodifikasi ke terminal.
KeithB

Baris perintah yang tepat di sini adalah texcount foo.tex | tee output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt. Atau Anda bisa menggunakannya texcount foo.tex | tee output.txt; sed s/$/'\\\\'/ output.txt > wc.tex. Dalam kedua kasus itu, Anda mungkin ingin melakukannya rm output.txtsesudahnya.
dubiousjim

@dubiousjim Titik koma itu benar - pipa bekerja, tetapi titik koma lebih baik mengungkapkan apa yang dimaksudkan.
Danny Staple

6

Anda bisa menggunakan yang terbilang idiom

texcount foo.tex | tee /dev/tty | sed s/$/'\\\\'/ > wc.tex

/dev/tty adalah perangkat ajaib yang mengacu pada terminal pengontrol dari proses saat ini.

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.