15分钟上手smenu:打造高效命令行交互选择系统

15分钟上手smenu:打造高效命令行交互选择系统

【免费下载链接】smenu smenu started as a lightweight and flexible terminal menu generator, but quickly evolved into a powerful and versatile CLI selection tool for interactive or scripting use. 【免费下载链接】smenu 项目地址: https://gitcode.com/gh_mirrors/sme/smenu

你还在为终端选择操作抓狂?一站式解决80%的命令行交互痛点

读完本文你将掌握:

  • 3分钟上手的smenu核心用法
  • 10+企业级场景实战案例
  • 7个提升效率的隐藏技巧
  • 从入门到精通的完整学习路径

什么是smenu?重新定义终端交互体验

smenu是一款交互式选择过滤器(Selection Filter),如同sed是编辑过滤器一样。它从标准输入或文件读取数据,以多种布局展示在滚动窗口中,通过键盘和鼠标轻松完成单/多项选择。

核心优势

传统方法smenu解决方案效率提升
手动输入冗长参数可视化选择60%
grep+awk多层过滤实时搜索定位75%
编写复杂交互脚本一行命令实现菜单90%
无法处理动态数据管道实时生成选项85%

工作原理

mermaid

极速上手:从安装到第一个交互菜单

安装指南

源码编译
# 克隆仓库
git clone https://gitcode.com/gh_mirrors/sme/smenu
cd smenu

# 编译(支持configure参数)
./build.sh --prefix=/usr/local

# 安装
sudo make install
系统包管理器
# Debian/Ubuntu
sudo apt install smenu

# Fedora/RHEL
sudo dnf install smenu

# Arch Linux
sudo pacman -S smenu

第一个示例:进程选择器

# 列出所有进程并选择终止
echo "即将终止进程:"
ps aux | awk '{print $2, $11}' | smenu -n 15 -c -m "选择要终止的进程"

核心功能全解析

基础语法与输入输出

# 标准用法
echo -e "option1\noption2\noption3" | smenu [选项]

# 从文件读取
smenu -i input.txt

窗口布局控制

参数作用示例
-n窗口高度-n 20 (20行)
-c列模式-c -C 3 (3列)
-l行模式-l (单行滚动)
-M居中显示-M (窗口居中)
-ggutter间距-g ' ' (2空格边距)

搜索与导航

三种搜索模式对比:

mermaid

快捷键速查表
操作键盘鼠标
上下移动↑↓/jk滚轮
页滚动PgUp/PgDn滚动条点击
直接选择数字键双击
搜索/右键菜单
退出q/Ctrl+C-

高级选择功能

多选标记(Tag模式)
# 启用标记模式,空格切换选择,Enter确认
echo -e "a\nb\nc\nd" | smenu -T -m "多选示例(空格标记)"
超时自动选择
# 5秒无操作自动选择默认项
echo -e "yes\nno\nmaybe" | smenu -x cur maybe 5 -m "5秒后默认选择maybe"

企业级实战案例

案例1:交互式文件管理器

#!/bin/bash
# 文件浏览选择器

while true; do
  DIR=$(ls -d */ | smenu -m "选择目录" -s /..)
  [[ $DIR == ".." ]] && cd .. || cd "$DIR"
  clear
  ls -la
  echo -e "\n当前目录: $(pwd)"
done

案例2:系统服务管理菜单

#!/bin/bash
# 服务控制中心

SERVICES=$(systemctl list-unit-files --type=service --state=enabled --no-legend | awk '{print $1}')

SELECTED=$(echo "$SERVICES" | smenu -c -n 10 -m "服务管理")

if [[ -n $SELECTED ]]; then
  ACTION=$(echo -e "start\nstop\nrestart\nenable\ndisable\nstatus" | smenu -m "选择操作")
  sudo systemctl $ACTION $SELECTED
  systemctl status $SELECTED --no-pager
fi

案例3:LVM管理界面(来自官方示例)

#!/usr/bin/env bash
# lvm_menu.sh

MENU+="\
'Create' 'Delete' 'Extend' 'Shrink'
'VGC VG' 'VGD VG' 'VGE VG' 'VGS VG'
'LVC LV' 'LVD LV' 'LVE LV' 'LVS LV'
'PVC PV' 'PVD PV'
#
'L List'
#
'Quit Exit menu'"

trap "exit 1" INT

while true
do
   clear
   echo "LVM管理控制台"
   echo

   read REP <<< $(echo "$MENU" | ./menu.sh -p smenu -i "LVM管理")

   case $REP in
     ABORT) exit 1         ;;
     QUIT)  exit 0         ;;

     L)     lvs && pvs     ;;
     VGC)   vgcreate       ;;
     # 更多操作...
   esac

   echo -n "按Enter继续..."
   read
done

深度定制与优化

配置文件详解

# ~/.smenu 或 /etc/smenu.ini
[display]
color_fg=7
color_bg=0
title_attr=1

[mouse]
enable=true
double_click_delay=300

[search]
default_method=fuzzy
timeout=5

性能优化技巧

  1. 大数据处理:使用-i/-e参数预过滤

    cat large_file.txt | smenu -i '^pattern' -n 50
    
  2. 缓存常用菜单:结合bash数组缓存结果

    declare -A MENU_CACHE
    if [[ -z ${MENU_CACHE[$key]} ]]; then
      MENU_CACHE[$key]=$(generate_menu)
    fi
    echo "${MENU_CACHE[$key]}" | smenu
    
  3. 减少重绘:使用-d参数清理窗口

常见问题与解决方案

Q: 如何处理包含空格的选项?

A: 使用引号包裹或-Q参数忽略引号

echo -e "'option with space'\n'another option'" | smenu
# 或
echo -e "option with space\nanother option" | smenu -Q

Q: 中文显示乱码怎么办?

A: 确保终端支持UTF-8并设置正确locale

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

Q: 如何保存选择历史?

A: 结合tee命令记录选择

echo -e "a\nb\nc" | smenu | tee -a selection_history.log

从入门到专家的进阶路径

mermaid

总结与资源

关键知识点

  • smenu是选择过滤器,非编辑器或分页器
  • 核心价值在于交互式选择,简化CLI操作
  • 擅长处理动态数据用户交互场景
  • 轻量级设计,无依赖但功能强大

扩展资源

  • 官方仓库:https://gitcode.com/gh_mirrors/sme/smenu
  • 示例集合:项目examples目录
  • 社区讨论:GitHub Discussions

下期预告

《smenu与自动化工作流:从DevOps到日常办公》

如果你觉得本文有价值,请点赞👍收藏⭐关注,不错过更多实用工具指南!

【免费下载链接】smenu smenu started as a lightweight and flexible terminal menu generator, but quickly evolved into a powerful and versatile CLI selection tool for interactive or scripting use. 【免费下载链接】smenu 项目地址: https://gitcode.com/gh_mirrors/sme/smenu

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值