跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C

Linux 简易版 SHELL 实现

在 Linux 环境下使用 C 语言实现简易版 SHELL 的方法。主要内容包括设置命令提示符格式、通过 fgets 函数获取用户键盘输入、将换行符替换为字符串结束符,以及构建循环交互结构。代码展示了如何获取用户名、主机名和当前路径来格式化输出,并验证了基本的命令行读取功能。

DevOpsTeam发布于 2026/3/29更新于 2026/9/1069 浏览
Linux 简易版 SHELL 实现

一、前言

本文利用进程相关知识,实现一个简易版的 SHELL。

二、SHELL 实现

1.获取命令行,实现交互

实现 SHELL 的第一步是从键盘获取用户的输入,即命令行。

设置打印格式
#define LEFT "["
#define RIGHT "]"
#define LABLE "#"
int quit = 0;
char commandline[LINE_SIZE];
char pwd[LINE_SIZE];

// 获取用户名
const char *getusername() {
    return getenv("USER");
}

// 获取主机名
const char *gethostname() {
    return getenv("HOSTNAME");
}

// 获取当前进程所处路径
void getpwd() {
    getcwd(pwd, sizeof(pwd));
}

// 设置打印格式
printf(LEFT "%s@%s %s" RIGHT "" LABLE " ", getusername(), gethostname(), pwd);
获取键盘输入

在获取键盘输入的函数有很多,这里以 fgets() 函数为例。我们需要定义一个字符数组来存储读取的命令行参数。注意细节:读到字符串的 \n 需换成 \0,因为 fgets 默认以换行作为分隔符,读到的字符串会包括换行符,但这并非命令输入的一部分。

#define LINE_SIZE 1024
char commandline[LINE_SIZE];

void interact(char* cline, int size) {
    getpwd();
    printf(LEFT "%s@%s %s" RIGHT "" LABLE " ", getusername(), gethostname(), pwd);
    char *s = fgets(cline, size, stdin);
    assert(s);
    (void)s;
    cline[strlen(cline)-1] = '\0';
}

至此完成了命令行参数的获取。由于 SHELL 进程一直读取用户输入,因此设置为循环形式。

int quit = 0;
void interact(char* cline, int size) {
    getpwd();
    printf(LEFT "%s@%s %s" RIGHT "" LABLE " ", getusername(), gethostname(), pwd);
    char *s = fgets(cline, size, stdin);
    assert(s);
    (void)s;
    cline[strlen(cline)-1] = '\0';
    if(s) printf("echo : %s\n", cline);
}

int main() {
    while(!quit) {
        // 1. 交互问题,获取命令行
        interact(commandline, sizeof(commandline));
    }
    return 0;
}

运行后可验证格式和读取是否正确。

目录

  1. 一、前言
  2. 二、SHELL 实现
  3. 1.获取命令行,实现交互
  4. 设置打印格式
  5. 获取键盘输入

更多推荐文章

查看全部
  • 2024 年 GitHub 谷歌学术与 Sci-Hub 镜像站使用指南
  • Stable Diffusion XL 1.0 灵感画廊镜像免配置部署指南
  • UZH RPG 组提出 AC-MPC:微分 MPC 赋能强化学习实现高速无人机竞速
  • JDK 17 官方下载与基础环境配置
  • 利用 Anthropic frontend-design Skill 提升大模型前端设计审美
  • 堆排序与 TopK 问题实战解析
  • 蓝桥杯 2025 省赛 Python B 组题目解析
  • 基于 C# 的 PLC 转 Web API 服务器框架实现
  • 前端加密靶场 encrypt-labs 环境搭建与全关卡解析
  • 车载网关 GW 连接外部 IP Tester 技术解析
  • DeepSeek-R1-Distill-Qwen-1.5B 部署指南:vLLM+Open WebUI 低显存运行方案
  • Java 入门:运算符与逻辑控制
  • 腾讯元宝全场景使用指南:办公学习与生活规划
  • 大模型全解:定义、原理、应用与优劣势分析
  • Flood Fill 算法详解:从图像渲染到岛屿问题
  • LLM 大模型应用落地与优化:评测体系构建指南
  • MiroFish:基于多智能体的群体智能预测引擎实战
  • Linux 多线程编程:线程栈、TLS、互斥锁与条件变量
  • 使用 Jenkins Pipeline 自动化构建与部署 Java 项目
  • AI 编程工具选型指南:Copilot、Trae 等主流方案深度解析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online