Diberikan perintah yang mengubah perilakunya ketika outputnya menuju ke terminal (mis. Menghasilkan keluaran berwarna), bagaimana output itu dapat dialihkan dalam pipa sambil mempertahankan perilaku yang berubah? Pasti ada utilitas untuk itu, yang tidak saya sadari.
Beberapa perintah, seperti grep --color=always
, memiliki flag opsi untuk memaksa perilaku, tetapi pertanyaannya adalah bagaimana menangani program yang hanya mengandalkan pengujian deskriptor file output mereka.
Jika itu penting, shell saya ada bash
di Linux.
Jawaban:
Anda mungkin mendapatkan apa yang Anda butuhkan dengan menggunakan
unbuffer
.unbuffer
adalah atcl
/expect
script. Lihatlah sumbernya jika Anda mau. Perhatikan juga bagian CAVEATS pada manusia.Perhatikan juga bahwa itu tidak mengeksekusi alias seperti:
kecuali ada yang menambahkan trik seperti dicatat oleh Stéphane Chazelas:
Jika Anda melakukan
alias unbuffer='unbuffer '
(perhatikan spasi tambahan), maka alias akan diperluas setelahnyaunbuffer
.sumber
alias unbuffer='unbuffer '
(perhatikan spasi tambahan), maka alias akan diperluas setelahnyaunbuffer
.unbuffer
ini!sudo apt install expect
- Itu tidak jelas.Sejarah toolets
Anda bukan orang pertama yang menginginkan alat seperti itu. Orang-orang telah menginginkan alat seperti itu selama 30 tahun. Dan mereka sudah ada hampir selama itu juga.
Alat paling awal untuk hal semacam ini adalah paket "pty" Daniel J. Bernstein, yang dijelaskan oleh Rich Salz sebagai "pisau Ginsu", yang ditulis Bernstein pada pergantian tahun 1990-an untuk menipu di nethack (sic!). Versi 4 dari paket "pty" diterbitkan pada tahun 1992 untuk
comp.sources.unix
(volume 25 masalah 127 hingga 135). Itu masih dapat ditemukan di World Wide Web. Paul Vixie menggambarkannya pada saat itu:Bernstein kemudian memperbarui ini, sekitar atau sebelum 1999-04-07, dengan paket "ptyget", yang ia umumkan:
Paket terpisah itu adalah paket "sess".
"ptyget", secara kebetulan, terkenal karena mencontohkan versi yang sangat awal, dan salah satu dari sedikit contoh yang diterbitkan, sistem build "redo" buatan Berstein yang tidak pernah dipublikasikan.
dependon
adalah prekursor yang jelas untukredo-ifchange
.Pemakaian
ptybandage
ptybandage
adalah apa yang biasanya orang inginkan dalam sesi login. Kasus penggunaan utamanya adalah membuat program yang peka terhadap apakah input, output, atau kesalahan standar mereka terhubung ke terminal yang beroperasi seperti itu meskipun mereka sebenarnya dalam jaringan pipa shell, atau deskriptor file standarnya dialihkan ke file.Dibutuhkan perintah untuk menjalankan (yang telah menjadi perintah eksternal yang tepat, tentu saja) dan berjalan itu sedemikian rupa sehingga berpikir bahwa standar input, output, dan kesalahan yang melekat pada terminal, menghubungkan mereka melalui
ptybandage
's input standar asli, keluaran, dan kesalahan.Ini berurusan dengan nuansa berjalan di bawah cangkang kontrol pekerjaan, memastikan bahwa karakter STOP terminal tidak hanya berhenti
ptybandage
tetapi juga menghentikan program yang berjalan terpasang ke terminal bagian dalam.ptyrun
ptyrun
adalah apa yang biasanya orang inginkan di server jaringan TCP. Kasus penggunaan utamanya adalah lingkungan eksekusi jarak jauh yang belum mengatur terminal sendiri, menjalankan program yang tidak beroperasi seperti yang diinginkan ketika tidak ada terminal.Itu tidak berharap untuk berjalan di bawah shell kontrol pekerjaan, dan jika perintah yang dijalankan menerima sinyal berhenti itu hanya restart.
Toolset yang tersedia
Dru Nelson menerbitkan "pty" versi 4 dan "ptyget".
Paul Jarc menerbitkan versi ptyget yang tetap, yang mencoba untuk berurusan dengan perangkat pseudo-terminal khusus sistem operasi ioctls di sistem asli yang sebenarnya tidak lagi disediakan oleh sistem operasi.
Paket source nosh dilengkapi dengan workalike
ptybandange
danptyrun
skrip, yang menggunakanexecline
alat Laurent Bercot dan perintah pseudo-terminal manajemen paket nosh itu sendiri. Pada nosh versi 1.23 ini tersedia pra-paket dalam paket nosh-terminal-ekstra. (Versi sebelumnya hanya menyediakannya untuk orang yang membangun dari sumber.)Beberapa contoh menggunakan
Jurjgen Oskam menggunakan
ptybandage
pada AIX untuk memasukkan input dari dokumen di sini ke program yang terbuka dan membaca terminal pengendali untuk prompt kata sandi:Andy Bradford menggunakan
ptyrun
OpenBSD di bawah daemontools dan ucspi-tcp untuk membuatbgplgsh
program kontrol router interaktif dapat diakses melalui jaringan sementara membuatnya berpikir bahwa itu berbicara ke terminal:Bacaan lebih lanjut
redo
. Jawaban yang Sering Diberikan.bgplgsh
. 8. Halaman manual OpenBSD.sumber
expect
?Anda dapat menggunakan socat untuk memulai proses Anda dengan pty terhubung, dan mendapatkan socat untuk menghubungkan ujung pty lain ke file. AFAIU mana yang persis Anda tanyakan:
Metode ini akan menyebabkan
isatty
dipanggil olehmy-command
untuk kembalitrue
dan proses yang hanya bergantung pada yang akan tertipu untuk kode kontrol keluaran. Perhatikan bahwa beberapa proses (terutamagrep
) juga memeriksa nilaiTERM
variabel lingkungan, jadi Anda mungkin perlu mengaturnya ke sesuatu yang masuk akal, seperti"xterm"
sumber
Ada juga solusi bagus yang diposting di sini di Super User oleh KarlC :
Kompilasi pustaka bersama kecil:
Kemudian beri tahu perintah Anda untuk memuat
isatty(3)
penggantian ini secara dinamis:Ini mungkin tidak bekerja untuk setiap perintah di luar sana, bahkan mungkin memecah beberapa dengan cara yang tidak terduga, tetapi mungkin akan bekerja dalam kebanyakan kasus.
sumber
DYLD_INSERT_LIBRARIES=./isatty.so DYLD_FORCE_FLAT_NAMESPACE=y mycommand
Bagaimana kalau menggunakan
script(1)
?Sebagai contoh:
Akan menyimpan
ls
outputout_file
dengan kode warna dipertahankan.sumber
out_file
dengan warnanya?less -R
. Namun, dalam hal ini, saya ingin output berlanjut di dalam pipa, yang akhirnya berakhir di terminal saya. Menggunakancat
untuk ilustrasi, itu adalah sesuatu sepertiscript -q -c 'ls -G' /dev/null | cat
, yang menekantypescript
file sepenuhnya, hanya menyisakan output program.-
) sebagaiscript
file output, untuk contoh:script -q -c 'ls -G' -
Berdasarkan jawaban @ Amir , berikut adalah skrip yang menghasilkan dan kemudian menyertakan pustaka saat runtime:
sumber