2009-12-28 17 views
10

estoy tratando de utilizar whiptail ya que es una alternativa ligera a dialog y parece estar instalado por defecto en la mayoría de los sistemas (es decir, las personas no tienen que dar la vuelta e instalarlo si es "olvidado" o no se ha instalado por defecto). Comprobé question #1562666 para ver algunos ejemplos aquí, pero estoy buscando una alternativa para redirigir la salida, de modo que establezca una variable de entorno, en lugar de solo escribir en el disco.whiptail: ¿Cómo redirigir la salida a la variable de entorno?

Por ejemplo, cuando trato con el diálogo, esto funciona (vea la caja de diálogo, y se establece una variable de entorno):

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

Sin embargo, esto no funciona cuando se utiliza en lugar de cola de látigo diálogo, ya que el cuadro de diálogo nunca aparece. Tengo que redirigirlo a un archivo de disco y leerlo, por ejemplo:

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

Funciona, y puedo utilizar el mismo archivo temporal de principio a fin (retirarlo cuando termina la secuencia de comandos). Pero se siente incómodo al usar el disco solo para esto, en lugar de tenerlo todo en la memoria (redirigir a una variable de entorno).

Así que estoy preguntando: ¿Estoy olvidando algo? O ¿tengo realmente tengo que usar el disco cuando uso whiptail?

Gracias de antemano por sus comentarios.

+0

Parece que cada vez que whiptail tiene su stdin/stdout redirigido, no se muestra (ya sea con $ (...) o ... |). Su solución se ve bastante bien, considerado el comportamiento de Whiptail. Por cierto, en mi máquina Debian, tengo cola de gol pero no hay diálogo por defecto, en opensuse, tengo diálogo y no whiptail existente en los repositorios oficiales. – Zeograd

+0

@Zeograd al menos en RHEL whiptail viene en el paquete "newt". – Kimvais

+0

Derecha, thx Kimvais. "zypper search whiptail" me falló incluso si la información indicaba que estaba en. – Zeograd

Respuesta

28

Esto es probablemente porque whiptail utiliza entrada y salida estándar para imprimir el cuadro de entrada, por lo que no se puede redirigir stderr directamente a la salida estándar, pero hay que cambiarlos, por ejemplo:

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

Verifiqué que lo anterior funciona. –

+2

Etiquetado WORKSFORME. Gracias Kimvais! – jbatista

+0

Tengo una pregunta. ¿Por qué pones '3> & 1 1> & 2 2> & 3' al final de Whiptail? Sin él, el comando no funciona, pero no sé por qué. –

2

Parece que whiptail (1) escribe su salida de control a la termininal basado en el valor de la variable de entorno TERM. Consecuentemente, no puede usar la corriente de salida estándar de whiptail (1) para establecer una variable. Además, whiptail (1) escribe la entrada de usuario del cuadro de entrada en la secuencia de error estándar, por lo que, una vez más, no puede usar su flujo de salida estándar para establecer una variable.

Cuestiones relacionadas