Saya mencoba melakukan kebalikan dari " Deteksi jika stdin adalah terminal atau pipa? ".
Saya menjalankan aplikasi yang mengubah format outputnya karena mendeteksi pipa pada STDOUT, dan saya ingin itu berpikir bahwa ini adalah terminal interaktif sehingga saya mendapatkan output yang sama ketika mengarahkan ulang.
Saya berpikir bahwa membungkusnya dalam expect
skrip atau menggunakan proc_open()
dalam PHP akan melakukannya, tetapi tidak.
Ada ide di luar sana?
Jawaban:
Aha!
The
script
perintah melakukan apa yang kita inginkan ...Apakah caranya!
sumber
script
bahkan tersedia di BusyBox !less -R
, ke mana input terminal menujuless -R
, maka Anda memerlukan beberapa tipu daya tambahan. Sebagai contoh, saya ingin versi yang berwarnagit status | less
. Anda harus lulus-R
kurang agar menghormati warna, dan Anda harus menggunakanscript
untuk mendapatkangit status
warna keluaran. Tapi kami tidak inginscript
mempertahankan kepemilikan keyboard, kami ingin iniless
. Jadi saya menggunakan ini sekarang dan bekerja dengan baik:0<&- script -qfc "git status" /dev/null | less -R
. Beberapa karakter pertama itu menutup stdin untuk perintah ini.$-
variabel shell untuk "i".Py_Initialize
tidak melihat stdin / stderr yang tepat.Berdasarkan solusi Chris , saya menghasilkan fungsi pembantu kecil berikut:
Tampak aneh
printf
diperlukan untuk memperluas argumen skrip dengan benar$@
sambil melindungi bagian-bagian perintah yang mungkin dikutip (lihat contoh di bawah).Pemakaian:
Contoh:
sumber
--return
opsi, jika versi Andascript
memilikinya, untuk mempertahankan kode keluar proses anak.function faketty { script -qfc "$(printf "%q " "$@")" /dev/null; }
Jika tidak, file bernamatypescript
akan dibuat setiap kali perintah dijalankan, dalam banyak kasus.script: illegal option -- f
The unbuffer script yang datang dengan Harapkan harus menangani ok ini. Jika tidak, aplikasi mungkin melihat sesuatu selain dari apa outputnya terhubung, misalnya. apa variabel lingkungan TERM diatur ke.
sumber
Saya tidak tahu apakah itu bisa dilakukan dari PHP, tetapi jika Anda benar-benar membutuhkan proses anak untuk melihat TTY, Anda dapat membuat PTY .
Dalam C:
Saya sebenarnya mendapat kesan bahwa
expect
itu sendiri memang menciptakan PTY.sumber
Mengacu jawaban sebelumnya, pada Mac OS X, "skrip" dapat digunakan seperti di bawah ini ...
Tetapi, karena ini dapat menggantikan "\ n" dengan "\ r \ n" di stdout, Anda mungkin juga memerlukan skrip seperti ini:
Jika ada beberapa pipa di antara perintah-perintah ini, Anda perlu menyiram stdout. sebagai contoh:
sumber
Terlalu baru untuk mengomentari jawaban spesifik, tetapi saya pikir saya akan
faketty
menindaklanjuti fungsi diposting oleh ingomueller-net di atas karena baru-baru ini membantu saya keluar.Saya menemukan bahwa ini membuat
typescript
file yang tidak saya inginkan / butuhkan jadi saya menambahkan / dev / null sebagai file target skrip:function faketty { script -qfc "$(printf "%q " "$@")" /dev/null ; }
sumber
Memperbarui @ A-Ron untuk a) bekerja pada Linux & MacOs b) menyebarkan kode status secara tidak langsung (karena MacOs
script
tidak mendukungnya)Contoh:
sumber
Saya mencoba untuk mendapatkan warna ketika menjalankan
shellcheck <file> | less
, jadi saya mencoba jawaban di atas, tetapi mereka menghasilkan efek aneh di mana teks secara horizontal diimbangi dari tempat seharusnya:(Bagi mereka yang tidak terbiasa dengan shellcheck, garis dengan peringatan itu seharusnya sejalan dengan di mana masalahnya.)
Agar jawaban di atas berfungsi dengan shellcheck, saya mencoba salah satu opsi dari komentar:
Ini bekerja. Saya juga menambahkan
--return
dan menggunakan opsi panjang, untuk membuat perintah ini sedikit tidak dapat dipahami:Bekerja di Bash dan Zsh.
sumber
Ada juga program pty yang termasuk dalam kode contoh buku "Pemrograman Lanjutan di Lingkungan UNIX, Edisi Kedua"!
Berikut cara mengompilasi pty di Mac OS X:
sumber