求助:基于Shell脚本实现带菜单UI并fork子进程执行命令
实现带菜单UI的Shell命令执行程序
我帮你把这个菜单程序补全并梳理清楚,完全用Shell脚本就能搞定你的需求,而且符合你提到的fork子进程执行命令、禁用Ctrl+C的要求。
完整实现代码
#!/bin/bash # 捕获CTRL + C信号(SIGINT),忽略它,强制用户用退出选项离开 trap '' 2 # 主循环:持续显示菜单直到用户选择退出 while true do # 打印菜单UI echo "==================================" echo " 命令执行菜单" echo "==================================" echo "1. 执行 ls(查看当前目录内容)" echo "2. 执行 who(查看当前登录用户)" echo "3. 执行 top(查看系统进程状态,按q退出返回菜单)" echo "4. 退出程序" echo "==================================" read -p "请输入选择的数字(1-4):" choice # 根据用户选择执行对应操作 case $choice in 1) echo "正在执行 ls 命令..." # Shell执行外部命令默认会fork子进程,这里直接调用即可 ls -lh echo -e "\n命令执行完成,按回车键返回菜单..." read -r ;; 2) echo "正在执行 who 命令..." who echo -e "\n命令执行完成,按回车键返回菜单..." read -r ;; 3) echo "正在执行 top 命令(按q退出返回菜单)..." # top是交互式命令,执行完后会自动回到Shell(也就是我们的脚本循环) top ;; 4) echo "正在退出程序..." break # 跳出主循环,结束脚本 ;; *) echo "⚠️ 无效输入,请输入1-4之间的数字!" echo -e "\n按回车键返回菜单..." read -r ;; esac # 清屏,让菜单显示更整洁(可选,根据需要开启) # clear done echo "程序已退出!"
关键功能说明
- 禁用Ctrl+C退出:
trap '' 2这条命令捕获了编号为2的信号(也就是SIGINT,对应Ctrl+C),用空命令忽略它,这样用户按Ctrl+C不会终止脚本,必须选择选项4退出。 - fork子进程执行命令:在Shell中,执行
ls、who、top这类外部命令时,Shell会自动创建子进程来运行它们,执行完成后子进程退出,回到父进程(也就是我们的脚本循环),完全符合你的需求。 - 菜单循环逻辑:
while true构建了一个无限循环,直到用户选择选项4时用break跳出循环,结束程序。 - 交互优化:每个命令执行完成后(除了top,因为它是交互式的),会提示用户按回车返回菜单,避免菜单一闪而过。
内容的提问来源于stack exchange,提问作者James G
相关产品推荐
相关产品推荐

