Redirect input dari satu terminal ke terminal lain

7

Saya telah sshed ke dalam kotak linux dan saya menggunakan dvtm dan bash (walaupun saya juga sudah mencoba ini dengan layar Gnu dan bash). Saya memiliki dua terminal, saat ini / dev / pts / 29 dan / dev / pts / 130. Saya ingin mengarahkan input dari satu ke yang lain.

Dari apa yang saya mengerti, di / dev / pts / 130 saya bisa mengetik:

cat </dev/pts/29

Dan kemudian ketika saya mengetikkan / dev / pts / 29 karakter yang saya ketik harus muncul di / dev / pts / 130. Namun yang akhirnya terjadi adalah bahwa setiap karakter yang saya ketik akan dialihkan. Sebagai contoh, jika saya mengetik "halo" saya mendapatkan ini:

/dev/pts/29        |        /dev/pts/130

$                  |        $ cat </dev/pts/29
$ el               |        hlo

Ini benar-benar membuat frustrasi karena saya perlu melakukan ini untuk mengarahkan ulang io dari proses yang berjalan di gdb (Saya sudah mencoba menjalankan / dev / pts / # dan menetapkan inferior-tty / dev / pts / # dan keduanya menghasilkan perilaku yang disebutkan di atas). Apakah saya melakukan sesuatu yang salah, atau ini bug di bash / screen / dvtm?

Niki Yoshiuchi
sumber

Jawaban:

8

Dalam contoh sederhana Anda, Anda memiliki dua proses (cangkang, dan kucing ) yang mencoba membaca dari sisi "budak" tty. Hasilnya adalah bahwa satu proses mendapatkan beberapa karakter, yang lain mendapatkan yang lain.

Apa yang Anda maksud dengan "mengarahkan input dari satu [terminal] ke yang lain"? Dalam situasi Anda yang sebenarnya, proses apa yang coba dibaca dari setiap terminal? Apa yang ingin Anda lakukan dengan input yang diambil setelah Anda memilikinya? Apa sebenarnya yang ingin Anda capai?

Bagi saya, "redirect io dari proses yang berjalan di gdb" sepertinya lebih seperti membuka kembali stdin / stdout / stderr di dalam proses yang sudah berjalan.

Anda dapat mengubah stdin / stdout / stderr dari proses yang berjalan dengan (antara lain ) GDB. Jawaban untuk "Redirect STDERR / STDOUT dari suatu proses SETELAH itu dimulai, menggunakan baris perintah?" Menunjukkan bagaimana hal itu dapat dilakukan. Anda ingin mengganti tty pathname /dev/nulldengan jawaban, dan Anda mungkin ingin menangani stdin juga, tetapi teknik ini masih berlaku.


Anda harus dapat membuat contoh sederhana Anda berfungsi dengan baik, tetapi saya tidak yakin bahwa itu melakukan apa yang sebenarnya ingin Anda lakukan (perlu diingat bahwa terminal pseudo sebenarnya adalah sepasang perangkat, seperti dua ujung pipa dua arah, tetapi semua contoh Anda tidak berinteraksi dengan bagian 'budak').

Kunci untuk memperbaiki contoh Anda adalah untuk mendapatkan semua kecuali satu dari proses yang bersaing untuk (sementara) berhenti membaca dari terminal. Jika, seperti contoh Anda, Anda memiliki shell yang berjalan di sisi yang ingin Anda tangkap data, maka Anda dapat melakukan sesuatu seperti ini:

(
    s="$(stty -g)"
    exec 3<&0
    trap 'stty "$s" 0<&3;exit' 0 INT QUIT

    cat <<EOM
In some other terminal, run the command

    cat <$(tty)

Press ^C or ^\ to quit.
EOM

    stty raw isig brkint susp '' dsusp ''
    while true; do sleep 3600; done </dev/null
)
Chris Johnsen
sumber
Tujuan saya adalah menjalankan proses dalam gdb, tetapi berinteraksi dengan proses di terminal lain. Ini diminta karena saya mengatur pyclewn dan ketika dijalankan di terminal ia mengarahkan proses 'io ke / dev / null sehingga tidak memungkinkan untuk berinteraksi. Namun saya baru menyadari bahwa saya idiot karena saya hanya bisa melampirkan gdb ke proses yang berjalan di terminal terpisah sepenuhnya melewati masalah saya.
Niki Yoshiuchi
Saya juga mencari ini (debug kutukan dengan kutukan). Itu layak mendapatkan penjelasan tunggal. Simpan stdin lama, muat ulang stdin lama saat berhenti, dan yang terbaik dari semua input yang tidak dirunut. Pokoknya itu tidak berfungsi sempurna di Ubuntu. Reset diperlukan saat keluar, tetapi menggunakan manusia harus cukup untuk men-tweak itu, bagus!
albfan