whiptail: How to redirect output to environment variable?

15,613

Solution 1

This is probably because whiptail uses stdin and stdout to print the input box, so you cannot redirect stderr directly to stdout, but you need to swap them, e.g:

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

Solution 2

It appears that whiptail(1) writes its control output to the termininal based on the setting of the TERM environment variable. Conseqently, you can't use the standard output stream of whiptail(1) to set a variable. Also, whiptail(1) writes the user-input of the input box to the standard error stream so, again, you can't use its standard output stream to set a variable.

Share:
15,613

Related videos on Youtube

jbatista
Author by

jbatista

Updated on April 26, 2020

Comments

  • jbatista
    jbatista about 4 years

    I'm trying to use whiptail as it's a lightweight alternative to dialog and seems to be installed by default in most systems (i.e., people don't have to go around and install it if it's "forgotten" or wasn't installed by default). I checked question #1562666 for a few examples here, but I'm looking for an alternative for redirecting output so that is sets an environment variable, instead of just writing to disk.

    For example, when I try with dialog, this works (I see the dialog box, and an environment variable is set):

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

    However, this doesn't work when using whiptail in place of dialog, as the dialog box never shows up. I have to redirect it to a disk file and read it, for example:

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

    It works, and I can use the same tempfile from beginning to end (removing it when the script ends). But it feels awkward to be forced to use the disk just for this, instead of keeping it all in memory (redirecting to an environment variable).

    So I'm asking: Am I forgetting something -- or do I really have to use the disk when using whiptail?

    Thank you in advance for your feedback.

  • A. Dziedziczak
    A. Dziedziczak almost 7 years
    I have a question. Why you put 3>&1 1>&2 2>&3 at the end of whiptail? Without it command is not working, but I don't know why.
  • John Kugelman
    John Kugelman almost 5 years
    It swaps stdout and stderr, restoring sanity to the world. $(...) captures stdout so you really want the GUI stuff to print to stderr and the result to go to stdout, but whiptail has them swapped for some reason. Those three redirections swap them back.
  • Charles Duffy
    Charles Duffy almost 5 years
    ...I suppose one could add 3>&- to the end, to leave 1 and 2 swapped and 3 nicely closed. Not that it particularly matters, though.
  • Alan Corey
    Alan Corey over 2 years
    Could be helpful figuring out why it's hard to call from C. Spent a day or so trying that a couple years ago, gave up.

Related