2009-12-28 25 views
10

Ich versuche whiptail zu verwenden, da es eine leichte Alternative zu dialog ist und anscheinend in den meisten Systemen installiert ist (dh Leute müssen nicht herumgehen und es installieren, wenn es "vergessen" oder nicht installiert wurde standardmäßig). Ich überprüft question #1562666 für ein paar Beispiele hier, aber ich bin auf der Suche nach einer Alternative zum Umleiten der Ausgabe, so dass eine Umgebungsvariable setzt, anstatt nur auf die Festplatte zu schreiben.whiptail: Wie umleiten Ausgabe auf Umgebungsvariable?

Zum Beispiel, wenn ich mit Dialog versuchen, das funktioniert (ich das Dialogfeld angezeigt wird, und eine Umgebungsvariable gesetzt ist):

result=$(dialog --output-fd 1 --inputbox "Enter some text" 10 30) 
echo Result=$result 

Doch dies funktioniert nicht, wenn anstelle whiptail Verwendung von Dialog, da das Dialogfeld nie angezeigt wird. Ich habe es in eine Datei umleiten und es zum Beispiel lesen:

result=$(tempfile) ; chmod go-rw $result 
whiptail --inputbox "Enter some text" 10 30 2>$result 
echo Result=$(cat $result) 
rm $result 

Es funktioniert, und ich kann die gleiche tempfile von Anfang an verwenden zu beenden (es zu entfernen, wenn das Skript beendet). Aber es ist peinlich, gezwungen zu sein, die Festplatte nur dafür zu verwenden, anstatt sie im Speicher zu belassen (umleiten zu einer Umgebungsvariablen).

Also frage ich: Ich vergesse etwas - oder muss ich wirklich müssen die Festplatte verwenden, wenn Whiptail?

Vielen Dank im Voraus für Ihr Feedback.

+0

Es scheint so, wann immer whiptail hat seine stdin/stdout umgeleitet, wird nicht angezeigt (ob mit $ (...) oder ... |). Ihre Lösung sieht ziemlich gut aus betrachtet das Verhalten von Whiptail. BTW, auf meinem Debian-Rechner habe ich whiptail, aber standardmäßig keinen Dialog, auf opensuse, habe ich Dialog und kein existierendes Whiptail in den offiziellen Repositories. – Zeograd

+0

@Zeograd zumindest auf RHEL Whiptail kommt in "Newt" -Paket. – Kimvais

+0

Richtig, danke Kimvais. "zypper search whiptail" scheiterte bei mir, auch wenn die Information darauf hinwies, dass es in war. – Zeograd

Antwort

28

Dies ist wahrscheinlich, weil whiptail stdin und stdout verwendet das Eingabefeld zu drucken, so dass Sie nicht Stderr direkt zu stdout umleiten, aber Sie brauchen, um sie auszutauschen, zum Beispiel:

foobar=$(whiptail --inputbox "Enter some text" 10 30 3>&1 1>&2 2>&3) 
+4

Ich habe überprüft, dass das oben genannte funktioniert. –

+2

Verschlagwortet mit WORKSFORME. Danke Kimvais! – jbatista

+0

Ich habe eine Frage. Warum steckst du '3> & 1 1> & 2 2> & 3' am Ende des Whiptails? Ohne es funktioniert der Befehl nicht, aber ich weiß nicht warum. –

2

Es scheint, dass whiptail (1) seine Steuerausgabe basierend auf der Einstellung der Umgebungsvariable TERM an das Ende schreibt. Folglich können Sie den Standard-Ausgabestrom von whiptail (1) nicht verwenden, um eine Variable festzulegen. Außerdem schreibt whiptail (1) die Benutzereingabe des Eingabefeldes in den Standard-Fehlerdatenstrom, so dass Sie wiederum nicht seinen Standard-Ausgabestrom verwenden können, um eine Variable festzulegen.