<> == How do I use dialog to get input from the user? == Here is an example: {{{#!highlight bash # POSIX foo=$(dialog --inputbox "text goes here" 8 40 2>&1 >/dev/tty) printf "The user typed '%s'\n" "$foo" }}} The redirection here is a bit tricky. 1. The {{{foo=$(command)}}} is set up first, so the standard output of the command is being captured by bash. 1. Inside the command, the {{{2>&1}}} causes standard error to be sent to where standard out is going -- in other words, stderr will now be captured. 1. {{{>/dev/tty}}} sends standard output to the terminal, so the dialog box will be seen by the user. Standard error will still be captured, however. Another common {{{dialog(1)}}}-related question is how to dynamically generate a dialog command that has items which must be quoted (either because they're empty strings, or because they contain internal white space). One ''can'' use {{{eval}}} for that purpose, but the cleanest way to achieve this goal is to use an [[BashFAQ/005|array]]. {{{#!highlight bash # Bash unset -v m; i=0 words=(apple banana cherry "dog droppings") for w in "${words[@]}"; do m[i++]=$w; m[i++]="" done dialog --menu "Which one?" 12 70 9 "${m[@]}" }}} In this example, the while loop that populates the '''m''' array could have been reading from a pipeline, a file, etc. Recall that the construction {{{"${m[@]}"}}} expands to the entire contents of an array, but with each element implicitly quoted. It's analogous to the {{{"$@"}}} construct for handling positional parameters. For more details, see [[BashFAQ/050|FAQ #50]]. Newer [[BashFAQ/061|versions of bash]] have a slightly prettier syntax for appending elements to an array: {{{#!highlight bash # Bash 3.1 and up ... for w in "${words[@]}"; do m+=("$w" "") done ... }}} Here's another example, using filenames: {{{#!highlight bash # Bash files=(*.mp3) # These may contain spaces, apostrophes, etc. cmd=(dialog --menu "Select one:" 22 76 16) i=0 n=${#cmd[*]} for i in "${!files[@]}"; do cmd[n++]=$i; cmd[n++]=${files[i]} done choice=$("${cmd[@]}" 2>&1 >/dev/tty) printf "Here's the file you chose:\n" ls -ld -- "${files[choice]}" }}} A separate but useful function of dialog is to track progress of a process that produces output. Below is an example that uses dialog to track processes writing to a log file. In the dialog window, there is a tailbox where output is stored, and a msgbox with a clickable Quit. Clicking quit will cause trap to execute, removing the tempfile, and destroying the tail process. {{{#!highlight bash # POSIX # you cannot tail a nonexistent file, so always ensure it pre-exists! > dialog-tail.log { for i in 1 2 3; do printf '%d\n' "$i" sleep 1 done printf 'Done\n' } > dialog-tail.log & dialog --title "TAIL BOXES" \ --begin 10 10 --tailboxbg dialog-tail.log 8 58 \ --and-widget \ --begin 3 10 --msgbox "Press OK " 5 30 wait }}} For an example of creating a progress bar using {{{dialog --gauge}}}, see [[BashFAQ/044|FAQ #44]]. ---- CategoryShell