Create a select menu with smenu
Not Spoiled for Choice
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
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters
Support Our Work
Linux Magazine content is made possible with support from readers like you. Please consider contributing when you’ve found an article to be beneficial.
News
-
Red Hat Enterprise Linux 9.5 Released
Notify your friends, loved ones, and colleagues that the latest version of RHEL is available with plenty of enhancements.
-
Linux Sees Massive Performance Increase from a Single Line of Code
With one line of code, Intel was able to increase the performance of the Linux kernel by 4,000 percent.
-
Fedora KDE Approved as an Official Spin
If you prefer the Plasma desktop environment and the Fedora distribution, you're in luck because there's now an official spin that is listed on the same level as the Fedora Workstation edition.
-
New Steam Client Ups the Ante for Linux
The latest release from Steam has some pretty cool tricks up its sleeve.
-
Gnome OS Transitioning Toward a General-Purpose Distro
If you're looking for the perfectly vanilla take on the Gnome desktop, Gnome OS might be for you.
-
Fedora 41 Released with New Features
If you're a Fedora fan or just looking for a Linux distribution to help you migrate from Windows, Fedora 41 might be just the ticket.
-
AlmaLinux OS Kitten 10 Gives Power Users a Sneak Preview
If you're looking to kick the tires of AlmaLinux's upstream version, the developers have a purrfect solution.
-
Gnome 47.1 Released with a Few Fixes
The latest release of the Gnome desktop is all about fixing a few nagging issues and not about bringing new features into the mix.
-
System76 Unveils an Ampere-Powered Thelio Desktop
If you're looking for a new desktop system for developing autonomous driving and software-defined vehicle solutions. System76 has you covered.
-
VirtualBox 7.1.4 Includes Initial Support for Linux kernel 6.12
The latest version of VirtualBox has arrived and it not only adds initial support for kernel 6.12 but another feature that will make using the virtual machine tool much easier.