別のTTYでダイアログ/ホイップテイルスクリプトを実行することは可能ですか?


1

私にとっては、この問題の起源は、コマンドラインでwhiptailコマンドを実行できることです。 %pre Centosベースのカスタムディストリビューションをインストールするときのキックスタートファイルからのスクリプト。ただし、Anacondaで観察された動作は、あらゆるLinuxシステムの仮想端末を介して簡単に再現できます。

Anacondaでキックスタートとしてwhiptailコマンドを実行する %pre スクリプト新しいTTYでTTYを切り替えてコマンドを実行する必要があります。これを行う方法に関する一般的な提案は次のとおりです。

%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

この方法を使用すると、ホイップテイルダイアログボックスは新しいTTYに正しくレンダリングされますが、ダイアログとの対話はできません。 tabテキスト入力、 "Ok"、および "Cancel"要素を切り替えるのではなく、実際にはテキスト入力ボックスにタブを挿入します。同様に、矢印キーを使用すると、ダイアログにエスケープシーケンスが書き込まれます。

enter image description here

この動作は、python snack(whiptail - libnewtと同じライブラリを使用)とdialogを使用しているときにも見られます。

もちろん、whiptailを使用するのではなく、対話型シェルスクリプトを使用することもできますが、この動作を実現するための唯一の要件はそれであると考えていたので入力ストリームと出力ストリームを正しくリダイレ​​クトするため。

TL、DR

私は1つのTTYで実行することができ、スクリプトの出力/入力を別のTTYに/から持ってくることができるwhiptail / dialogコマンドを含むスクリプトを作成することに興味があります。

回答:


1

これは私にとってはうまくいきました(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

考えられる質問

  1. なぜあなたは使ったのですか /dev/pts/0

    Anacondaのコンソールから、私はどのデバイスが標準で実行されているスクリプトの標準入力として使用されているのかを見つけたからです。 pre% section。 RedHatとFedoraのバージョンによっては別のものになるかもしれません。しかし、どちらがあなたのケースにとって正しいのかを見つけるのは本当に簡単です。

  2. 何ですか exec {STDOUTBACK}>&1 そして exec {STDOUTBACK}>&- 物事?

    あなたを読みに行く man bash そしての検索 REDIRECTION このセクションには、次のものがあります。

ファイル記述子番号を前に付けることができる各リダイレクトの代わりに、次の形式の語を前に付けることができます。          {varname}この場合、&gt;&amp; - と&lt;&amp; - を除く各リダイレクト演算子に対して、シェルはファイルを割り当てます。          記述子は10より大きく、それをvarnameに割り当てます。 &gt;&amp; - または&lt;&amp; - の前に{varname}がある場合、var-の値          nameは閉じるファイル記述子を定義します。


0

これはコメントになるはずですが…

whiptailが変数に出力するには、stdin、stderr、stdoutを操作する必要があります。

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

これにより、出力が/ tmp / xに書き込まれます。

whiptail  --inputbox "hello" 10 40  3>/tmp/x 1>&2 2>&3

おそらく私の質問はあまり明確ではありませんでした。私は1つのTTYで実行することができ、スクリプトの出力/入力を別のTTYに/から持ってくることができるwhiptail / dialogコマンドを含むスクリプトの作成に興味があります。これは、1つの仮想端末を開き、(a)入力/出力ストリームを切り替え、(b)スクリプト内から仮想端末を切り替えようとすることでシミュレートできます。これの上で達成されます exec </dev/tty6 >/dev/tty6 2>/dev/tty6 そして chvt 6 それぞれ。
pxul
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.