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
-
New Linux Ultrabook from TUXEDO Computers
TUXEDO Computers has released a new 15" Ultrabook running Linux.
-
GNOME 43 To Bring Some Exciting New Features
GNOME 43 is getting close to the first alpha development release and it promises to add one particular feature that should be exciting to several users.
-
KaOS 2022.06 Now Available With KDE Plasma 5.25
The newest iteration of KaOS Linux not only adds the latest KDE Plasma desktop but sets LibreOffice as the default.
-
Manjaro 21.3.0 Is Now Available
Manjaro “Ruah” has been released and includes the latest Calamares installer, GNOME 42, and much more.
-
SpiralLinux is a New Linux Distribution Focused on Simplicity
A new Linux distribution, from the creator of GeckoLinux, is a Debian-based operating system with a focus on simplicity and ease of use.
-
HP Dev One Linux Laptop is Now Available for Pre-Order
The System76/HP collaboration Dev One laptop, geared toward developers, is now available for pre-order.
-
NixOS 22.5 Is Now Available
The latest release of NixOS with a much-improved package manager and a user-friendly graphical installer.
-
System76 Teams up with HP to Create the Dev One Laptop
HP and System76 have come together to develop a new laptop, powered by Pop!_OS and aimed toward developers.
-
Titan Linux is a New KDE Linux Based on Debian Stable
Titan Linux is a new Debian-based Linux distribution that features the KDE Plasma desktop with a focus on usability and performance.
-
Danielle Foré Has an Update for elementary OS 7
Now that Ubuntu 22.04 has been released, the team behind elementary OS is preparing for the upcoming 7.0 release.