网易首页 > 网易号 > 正文 申请入驻

很多人用了十年终端,其实根本没搞懂命令背后谁在干活

0
分享至

你每天都在用终端敲命令,但那个黑洞洞的窗口里到底发生了什么?大多数人以为终端本身就是那个解释命令的东西。其实大错特错——终端只是个容器,一个给你打字和看结果的“画框”。真正听懂 ls、grep、echo 的,是藏在内核和用户之间的那个家伙:Shell。意识到这一点之后,我决定自己从头写一个出来,不是因为轮子不够多,而是想看看这东西到底是怎么把键盘敲进去的字符串变成进程、变成管道、变成屏幕上那行结果的。写完之后我只想说:原来一个 shell 的骨架,远远比那些花里胡哨的插件要残酷得多。

第一步:别用 printf 和 scanf,用最底层的读写
很多人在 C 语言里处理输入输出,第一个想到的就是 printf 和 scanf。但这两个函数其实自带格式化,而且更像是“一次性”的操作,不适合 shell 那种持续交互的场景。所以我立刻放弃它们,改用 read() 和 write() 这两个系统调用。通过 STDIN_FILENO 和 STDOUT_FILENO 这两个文件描述符,就能在不依赖任何高级封装的情况下,持续地从键盘读入、往屏幕输出。这一步看起来很基础,但它直接决定了整个 shell 的性能底座——没有缓冲区溢出的风险,也没有多余的格式化开销,每敲一个字符都是实打实的系统调用在背后跑。对于一个想追求极致可控的程序来说,这几乎是一种精神洁癖。


第二步:把一行字拆成命令和参数,解析器才不是花架子
当你敲下echo "hello world",shell 必须立刻搞清楚三件事:谁是命令、谁是参数、以及整行输入到底有几个逻辑单元。这就是解析器的工作。我不搞什么花哨的语法树,就把用户输入按空格和引号切成一个个字符串,塞进一个数组里。数组的第一项就是命令名,后面的全是参数。粗暴、直接、有效。很多人以为解析器只是写来玩玩,但实际上这一步决定了后面所有管道和重定向能不能正确拼装。如果你的解析逻辑在带引号的参数里翻车,后面 fork 再多次也是白费力气。


第三步:fork 一把,每个命令都是一个崽
解析完之后,执行命令就顺理成章了。shell 本身是一个进程,用户输入的每一个命令,都必须变成它的子进程。这里我用了 Linux 最经典的 fork() 模型。调用 fork 之后,会凭空多出一个几乎一模一样的进程,然后通过判断返回值,让子进程去调用 execvp 执行真正的命令,父进程则老老实实调用 waitpid 等孩子跑完。这里有两个坑必须绕开:一是子进程里绝对不能忘了 exit,不然它会顺着代码继续往下跑,把父进程该干的活也干了;二是父进程一旦不等孩子,终端就会立刻把提示符弹出来,结果输出和下一行提示符搅成一锅粥。所有多任务的本质,说到底就是这一对父子关系在死磕。

第四步:管道不是魔法,是文件描述符的连线游戏
单个命令执行顺了,自然就想搞组合拳。比如ls | grep txt,这才是 shell 真正开始耍酷的地方。管道的实现原理其实非常朴素:先调用 pipe() 拿到一对文件描述符,一个读端一个写端,然后 fork 出两个子进程。第一个子进程关掉读端,用 dup2 把自己的标准输出强行掰到管道的写端;第二个子进程关掉写端,用 dup2 把标准输入掰到管道的读端。dup2 的作用,我自己的理解就是“把两个瓶口焊在一起”——它让原本往屏幕上写的流,直接灌进管道,也让原本等着键盘输入的流,改从管道里吸数据。这种文件描述符级别的连连看,一开始很容易搞混哪个端该关、什么时候关,因为操作系统给每个进程分配的资源是有限的,不用的端口必须立刻 close,否则程序跑着跑着就莫名其妙卡死。我目前的实现只支持两个子进程、一个管道,也就是一次只能串联两条命令。想要多重管道,就得把这种文件描述符的拼接再抽象一层,那是留给未来的自己头疼的事。


第五步:务必把不用的端口关掉,不然系统会教你做人
如果你从头看到这里,会发现整个过程里反复出现一个动作:close。无论是 fork 之后子进程里多余的管道端口,还是 dup2 重定向之后遗留的原始描述符,都必须马上关掉。很多人写 demo 的时候会忽略这一步,因为小数据量跑起来看不出来问题,可一旦压力上来,文件描述符就会像内存一样泄漏,直到操作系统一巴掌告诉你:no more file descriptors。写 shell 最需要培养的其实是对资源的洁癖——每开一个端口,都要在脑子里画一条生命线,确保它在离开作用域之前被关掉。这种肌肉记忆不是看教程能学会的,只能靠亲手把程序跑挂几次才能真正长记性。说到底,一个 shell 的健壮性,根本不是靠复杂的架构堆出来的,而是靠你对每一个文件描述符的敬畏心撑起来的。

把这一套流程全部跑通之后,我盯着自己那个黑框框里弹出的简单提示符,忽然觉得以前用的那些重量级终端都是糖果纸。它们提供的高亮、补全和历史记录当然很快乐,但在那之下,那个不停循环“读取-解析-执行”的循环体,才是真正决定你每一次敲击命运的引擎。从系统调用到进程管理,再到管道的文件描述符拼接,这一路写下来,最强烈的感受其实就一句:别再用“黑魔法”三个字来概括你每天在用的工具了,它的骨架比你想象的要直白,但也因为直白,所以才残酷。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
六月起,属蛇的人突然都开始“不对劲”了?

六月起,属蛇的人突然都开始“不对劲”了?

小陆搞笑日常
2026-06-03 01:05:34
异性对接吻一定要慎重,一旦“接吻”了,关系就会发生重大变化!

异性对接吻一定要慎重,一旦“接吻”了,关系就会发生重大变化!

皓皓情感说
2026-05-15 12:29:38
被送入ICU抢救治疗超10天,女歌手发文讲述生死经历

被送入ICU抢救治疗超10天,女歌手发文讲述生死经历

南方都市报
2026-06-02 11:02:42
黄仁勋从口袋掏出RTX Spark,PC行业的“iPhone时刻”来了

黄仁勋从口袋掏出RTX Spark,PC行业的“iPhone时刻”来了

新京报
2026-06-02 12:16:41
从《装台》到《主角》,其貌不扬的郭文岗,用俩小角色赢得满堂彩

从《装台》到《主角》,其貌不扬的郭文岗,用俩小角色赢得满堂彩

暖心萌阿菇凉
2026-06-02 12:58:39
医生提醒:肺癌最危险信号,不是咳嗽,而是频繁出现这5种异常

医生提醒:肺癌最危险信号,不是咳嗽,而是频繁出现这5种异常

健康之光
2026-06-02 21:00:06
伊能静一年花掉120万保养,糖不碰冷饮不喝,结果现在上街得用伞和帽子把脸裹死

伊能静一年花掉120万保养,糖不碰冷饮不喝,结果现在上街得用伞和帽子把脸裹死

可乐谈情感
2026-06-03 00:41:29
与恩师穆里尼奥重聚皇马?德布劳内吐槽孔蒂,映射阿囧足球也乏味

与恩师穆里尼奥重聚皇马?德布劳内吐槽孔蒂,映射阿囧足球也乏味

穆里尼奥主义者
2026-06-01 21:21:25
她16岁带病夺冠,退役后定居美国,嫁美国帅哥,如今已成大老板

她16岁带病夺冠,退役后定居美国,嫁美国帅哥,如今已成大老板

悦君兮君不知
2026-05-31 18:13:09
云南,一方丈不幸身亡,整理遗物银行卡有528万存款,方丈女儿提出继承遗产,寺庙:出家人,这笔钱属于寺庙!

云南,一方丈不幸身亡,整理遗物银行卡有528万存款,方丈女儿提出继承遗产,寺庙:出家人,这笔钱属于寺庙!

LULU生活家
2026-05-30 18:01:03
【铜铝指数】6月2日:今日现货铜价大涨!LME铜铝价格同期大涨!

【铜铝指数】6月2日:今日现货铜价大涨!LME铜铝价格同期大涨!

中国线缆网
2026-06-02 10:31:44
SpaceX太空工厂拿证:运费暴降95%,中国还差工程验证

SpaceX太空工厂拿证:运费暴降95%,中国还差工程验证

粤语音乐喷泉
2026-06-02 20:21:47
直到伊朗下令轰炸美空军基地,全世界才惊觉,中国有句话说得很对

直到伊朗下令轰炸美空军基地,全世界才惊觉,中国有句话说得很对

锅锅爱历史
2026-05-31 16:08:36
江西一高校给子女参加高考的教职工发放5000元,另放5天带薪假,学校工作人员回应

江西一高校给子女参加高考的教职工发放5000元,另放5天带薪假,学校工作人员回应

极目新闻
2026-06-02 19:49:16
小红书为什么需要男人?

小红书为什么需要男人?

钛媒体APP
2026-06-01 15:17:12
网贷催收最新套路!12368立案、账户冻结,9成逾期的人都被吓懵了

网贷催收最新套路!12368立案、账户冻结,9成逾期的人都被吓懵了

侃故事的阿庆
2026-06-02 08:46:35
美司令曾言:一旦中国在台海设禁飞区,美将不得不击沉解放军战舰

美司令曾言:一旦中国在台海设禁飞区,美将不得不击沉解放军战舰

聊历史的阿稼
2026-06-01 18:58:38
金饰克价已大降300元

金饰克价已大降300元

界面新闻
2026-06-02 22:38:43
枇杷是胰岛素"杀手"?医生劝告:糖尿病患者,6种水果尽量少吃

枇杷是胰岛素"杀手"?医生劝告:糖尿病患者,6种水果尽量少吃

医学科普汇
2026-05-31 19:40:05
89岁老戏骨魏宗万突然离世!最后露面状态超好,离世原因太遗憾

89岁老戏骨魏宗万突然离世!最后露面状态超好,离世原因太遗憾

阿废冷眼观察所
2026-06-03 01:57:51
2026-06-03 04:19:00
闪存猎手
闪存猎手
全网蹲好价的野生捕手,算力与羊毛都不可辜负。
4440文章数 37关注度
往期回顾 全部

科技要闻

烧掉千亿后,美团、阿里、京东谁先止血?

头条要闻

演员魏宗万去世 曾在94版《三国演义》中饰演"司马懿"

头条要闻

演员魏宗万去世 曾在94版《三国演义》中饰演"司马懿"

体育要闻

1米74的业余联赛替补,在英超踢中卫

娱乐要闻

奚梦瑶何猷君补办婚礼超幸福

财经要闻

智元和宇树的“暗战”愈演愈烈

汽车要闻

星途神秘新车轮廓曝光 又一款性能SUV要来了?

态度原创

数码
游戏
房产
公开课
军事航空

数码要闻

苹果watchOS 27前瞻:改进心率追踪、引入新表盘、升级Siri

离发售不远了!《寂静岭》系列新作已公开游戏评级

房产要闻

5200巨量投资曝光!未来五年,海南格局大变!

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

伊朗媒体新发布最高领袖照片

无障碍浏览 进入关怀版