You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:38:35