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
-
Thousands of Linux Servers Infected with Stealth Malware Since 2021
Perfctl is capable of remaining undetected, which makes it dangerous and hard to mitigate.
-
Halcyon Creates Anti-Ransomware Protection for Linux
As more Linux systems are targeted by ransomware, Halcyon is stepping up its protection.
-
Valve and Arch Linux Announce Collaboration
Valve and Arch have come together for two projects that will have a serious impact on the Linux distribution.
-
Hacker Successfully Runs Linux on a CPU from the Early ‘70s
From the office of "Look what I can do," Dmitry Grinberg was able to get Linux running on a processor that was created in 1971.
-
OSI and LPI Form Strategic Alliance
With a goal of strengthening Linux and open source communities, this new alliance aims to nurture the growth of more highly skilled professionals.
-
Fedora 41 Beta Available with Some Interesting Additions
If you're a Fedora fan, you'll be excited to hear the beta version of the latest release is now available for testing and includes plenty of updates.
-
AlmaLinux Unveils New Hardware Certification Process
The AlmaLinux Hardware Certification Program run by the Certification Special Interest Group (SIG) aims to ensure seamless compatibility between AlmaLinux and a wide range of hardware configurations.
-
Wind River Introduces eLxr Pro Linux Solution
eLxr Pro offers an end-to-end Linux solution backed by expert commercial support.
-
Juno Tab 3 Launches with Ubuntu 24.04
Anyone looking for a full-blown Linux tablet need look no further. Juno has released the Tab 3.
-
New KDE Slimbook Plasma Available for Preorder
Powered by an AMD Ryzen CPU, the latest KDE Slimbook laptop is powerful enough for local AI tasks.