Apakah mungkin untuk menjalankan skrip dialog / whiptail dalam satu TTY dari yang lain?

1

Asal usul pertanyaan ini, bagi saya, adalah dapat menjalankan perintah whiptail dalam %preskrip dari file kickstart ketika menginstal distribusi khusus berdasarkan Centos. Namun, perilaku yang diamati di Anaconda dapat dengan mudah direproduksi melalui terminal virtual dari sistem Linux apa pun.

Untuk menjalankan perintah whiptail di Anaconda sebagai %preskrip kickstart , perlu untuk mengganti TTY dan menjalankan perintah di TTY baru ini. Saran yang berlaku tentang bagaimana melakukan ini adalah:

%pre
exec </dev/tty6 >/dev/tty6 2>/dev/tty6
chvt 6

# then execute your command, for example:
whiptail --inputbox "Enter some text..." 10 30

# switch back to the original TTY
chvt1
exec </dev/tty1 >/dev/tty1 2>/dev/tty1
%end

Dengan menggunakan metode ini, kotak dialog whiptail dirender dengan benar di TTY baru, namun tidak ada interaksi yang terjadi dengan dialog - misalnya menekan tab, alih-alih beralih di antara entri teks, elemen "Oke", dan "Batalkan", sebenarnya memasukkan tab di kotak entri teks. Demikian pula, menggunakan tombol panah menghasilkan urutan keluar yang ditulis dalam dialog:

masukkan deskripsi gambar di sini

Perilaku ini juga diamati ketika menggunakan camilan python (menggunakan perpustakaan yang sama dengan whiptail - libnewt) dan dialog.

Tentu saja, saya hanya bisa menggunakan skrip shell interaktif, daripada menggunakan whiptail, tapi saya hanya ingin tahu apakah ada yang punya saran mengapa perilaku ini terlihat, karena saya akan berpikir bahwa satu-satunya persyaratan untuk mendapatkan pekerjaan ini adalah untuk mengarahkan aliran input dan output dengan benar.

TL; DR

Saya tertarik untuk membuat skrip yang berisi perintah whiptail / dialog yang dapat dieksekusi dalam satu TTY dan meminta output / input skrip ke / berasal dari TTY yang berbeda.

pxul
sumber

Jawaban:

1

Ini bekerja untuk saya (Anaconda, Fedora 20):

%pre --log=/tmp/ks_pre.log
#!/bin/bash

# Backup fds in temporal ones
exec {STDOUTBACK}>&1
exec {STDERRBACK}>&2

# Go to current terminal for pre% section
exec 1>>/dev/pts/0
exec 2>>/dev/pts/0

# Show message
whiptail --yesno 'Do you like StackOverflow?' --yes-button 'Yes' --no-button 'No' 10 70
if [ $? = 1 ]
then
    echo 'User sucks' >> /tmp/ks_pre.log
else
    echo 'User rocks' >> /tmp/ks_pre.log
fi

# Restore fds
exec 1>&$STDOUTBACK
exec 2>&$STDERRBACK

# Close temporal fds
exec {STDOUTBACK}>&-
exec {STDERRBACK}>&-

%end

Pertanyaan yang mungkin:

  1. Kenapa kamu menggunakan /dev/pts/0?

    Karena dari konsol Anaconda saya menemukan perangkat apa yang digunakan sebagai stdin untuk skrip yang berjalan di pre% section. Saya kira, itu bisa saja tergantung pada versi RedHat dan Fedora. Tetapi sangat mudah untuk mengetahui mana yang benar untuk kasus Anda.

  2. Apa itu exec {STDOUTBACK}>&1dan exec {STDOUTBACK}>&-apa?

    Buka untuk membaca Anda man bashdan cari REDIRECTIONbagian, di mana Anda dapat menemukan yang berikut:

Setiap pengalihan yang dapat didahului dengan nomor deskriptor file sebaliknya dapat didahului oleh kata dari bentuk {varname}. Dalam hal ini, untuk setiap operator pengalihan kecuali> & - dan <& -, shell akan mengalokasikan deskriptor file lebih besar dari 10 dan menetapkannya ke varname. Jika> & - atau <& - didahului dengan {varname}, nilai var-name mendefinisikan deskriptor file untuk ditutup.

Gooseman
sumber
0

Ini harus menjadi komentar, tetapi ...

Anda harus memanipulasi stdin, stderr dan stdout untuk whiptail untuk output ke suatu variabel.

x=`whiptail  --inputbox "hello" 10 40  3>&1 1>&2 2>&3`

Ini menempatkan output ke / tmp / x:

whiptail  --inputbox "hello" 10 40  3>/tmp/x 1>&2 2>&3
pengguna150471
sumber
Mungkin pertanyaan saya tidak terlalu jelas. Saya tertarik untuk membuat skrip yang berisi perintah whiptail / dialog yang dapat dieksekusi dalam satu TTY dan meminta output / input skrip ke / berasal dari TTY yang berbeda. Ini dapat disimulasikan dengan membuka satu terminal virtual dan mencoba (a) beralih input / output stream dan (b) beralih terminal virtual dari dalam skrip. Di atas ini dicapai oleh exec </dev/tty6 >/dev/tty6 2>/dev/tty6dan chvt 6masing - masing.
pxul