Create a select menu with smenu
Not Spoiled for Choice

© Lead Image © acik, 123RF.com
The smenu tool reduces the effort of creating shell menus to one line, with numerous options for a wide range of design alternatives.
If you program for the shell frequently, sooner or later you will have to create a select menu, which usually requires several lines of code – unless you use smenu. Smenu reduces the menu's script to a single line. A number of parameters allow you to adapt the design and to simplify your work a little.
The source code for smenu is available on its project page [1], which contains installation instructions, as well as some useful tips. The smenu wiki [2] contains links to two YouTube videos that demonstrate the practical use of the program. The README file provides a structured overview of smenu's options [1].
Basic Function
In smenu's simplest form, a command's output is passed via pipe to the smenu
command. For example, <command>
| smenu
displays a selection on a single line. To create a line-by-line menu, use <command>
| smenu -c
(Figure 1).

For a freely defined menu, transfer the selection options using the echo
command. However, the examples in Figure 2 only show the most rudimentary form: It doesn't make sense to use the tool without variables.
1 lists the most important call options for smenu. Press Enter to select a menu option, and press Q to exit the menu without selecting. To search within the selection, use the forward slash (/) in the open menu and then enter the search term.
When the search completes, the cursor stops at the first hit, and the background appears blue instead of black. If you wait seven seconds, the software reverts back and waits for your next input. Typically, the selection results from the data obtained via the pipe.
Script Use
To use the result of the selection, apply command substitution, as shown in Listing 1, line 1 (current syntax) and line 2 (obsolete syntax). Listing 2 and Listing 3 show two functional examples, and Figure 3 shows their usage.
Listing 1
Command Substitution
VARIABLE=$([COMMAND] | smenu) VARIABLE=`[COMMAND] | smenu`
Listing 2
A Selection with Explanations
#!/bin/sh a=$(echo "1 first \n 2 second \n 3 third \n" | smenu -c) echo "input value: $a"
Listing 3
Selecting a File
#!/bin/sh b=$(ls *.txt | smenu -c) echo "Selected file: $b"

Table 1
smenu Options
Option | Action | Tip/Example |
---|---|---|
|
Column mode |
|
|
Heading |
|
|
Limit lines in selection |
|
|
Center menu |
|
|
Delete menu according to selection on the screen |
– |
|
Selection with several columns |
|
|
Selection with multiple columns at full terminal width |
Together with |
|
Allow multiple selections |
|
|
Exclude the transferred string from the selection |
|
|
Only allow designated strings to select |
Listing 4
Specifying the Heading
#!/bin/sh clear a=$(ls -1 *.txt | smenu -n3 -c -m "Select file:") echo "Selected file: $a"
Listing 5
The -t Option
#!/bin/sh clear a=$(ls -1 *.txt | smenu -n3 -c -m "Select file:" -t2) echo "Selected file: $a"
Listing 6
Using a Colon as a Field Separator
#!/bin/sh clear a=$(ls -1 *.txt | smenu -n5 -T: -c -m "Select file(s) (mark with [T]):") echo "Selected file(s): $a"
Listing 7
The -e Option
#!/bin/sh clear a=$(ls -1 | smenu -n5 -c -e [m][4] -m "Select file: ") echo "Selected file: $a"
Listing 8
The -i Option
#!/bin/sh clear a=$(ls -1 | smenu -n5 -c -i [t][x][t] -m "Select file: ") echo "Selected file: $a"
Listing 2 demonstrates how to establish a selection with explanations. The end-of-line symbol (newline), which you represent with an escape sequence (\n
), serves as a separator between the entries. Within an entry, the space serves as a separator between fields. The result adopted in the variable is the value from the first column. Smenu only inverts the current value of the variable on the screen, not the full line.
Listing 3 shows just how easily users can select a file interactively.
Improvements
Figure 4 shows a small menu, which already has some additional features. If the list of entries reaches a certain number of lines, a green scrollbar appears.
If you limit the number of visible lines to three with -n3
, the bar appears as soon as the length of the list exceeds this value. Use the -m "<text>"
option to specify the heading. Listing 4 shows the corresponding code.
Look at the scrollbar in Figure 4 more closely: If you reach the start or the end of the selection, the arrow symbol appears. The arrows indicate more entries in the respective directions.
If you need a selection with multiple columns, type the number of columns using the -t
option (Listing 5). Figure 5 shows the result on the terminal screen. If you want to expand the line content to the terminal's full width, use the -w
option.
Buy this article as PDF
(incl. VAT)
Buy Linux Magazine
Direct Download
Read full article as PDF:
Price $2.95
News
-
Another New Linux Laptop has Arrived
Slimbook has released a monster of a Linux gaming laptop.
-
Mozilla VPN Now Available for Linux
The promised subscription-based VPN service from Mozilla is now available for the Linux platform.
-
Wayland and New App Menu Coming to KDE
The 2021 roadmap for the KDE desktop environment includes some exciting features and improvements.
-
Deepin 20.1 has Arrived
Debian-based Deepin 20.1 has been released with some interesting new features.
-
CloudLinux Commits Over 1 Million Dollars to CentOS Replacement
An open source, drop-in replacement for CentOS is on its way.
-
Linux Mint 20.1 Beta has Been Released
The first beta of Linux Mint, Ulyssa, is now available for downloading.
-
Manjaro Linux 20.2 has Been Unleashed
The latest iteration of Manjaro Linux has been released with a few interesting new features.
-
Patreon Project Looks to Bring Linux to Apple Silicon
Developer Hector Martin has created a patreon page to fund his work on developing a port of Linux for Apple Silicon Macs.
-
A New Chrome OS-Like Ubuntu Remix is Now Available
Ubuntu Web looks to be your Chrome OS alternative.
-
System76 Refreshes the Galago Pro Laptop
Linux hardware maker has revamped one of their most popular laptops.