代码只是一种逻辑的安排, 是一种对于计算机二进制操作的安排. 以C++这种编程语言为例: 我们接受它的语法规则, 写出符合它语法规则的一些语句(只有这样才能通过C++编译系统的处理), 然后通过它提供的转化工具(一套编译系统: 将我们写的源码转换成OS可加载到内存执行的二进制程序, 这时, 编译时的处理规则与我们接受的C++语法其实是’相同的’), 在CPU(或GPU)上, 将程序跑出来.
总的流程就是: 符合C++语法的源码 => C++编译系统转换成系统中可执行的文件 => 程序的执行.
那么, 又怎么理解Linux或Mac(终端)以及Windows系统中的命令行工具呢?! 其实它们对应的都是早期的真实’终端’: 上世纪7/80年代甚至更早的时候, 计算机从单程序执行的机器演变成了一种分时的系统(time-sharing, 就是能驻留很多程序在计算机中, 需要执行某个程序时就切换一下, 就和现在我们使用的计算机一样), 此种演变, 使得当时很贵的计算机能为多个用户所使用, 那么就需要多个能连接一个主机的多个终端(屏幕+键盘)咯. 随着个人计算机的普及(拜乔布斯和比尔盖茨等计算机从业者所赐), 计算机的使用成本下降了(每个人都能买得起), 使得这种终端变得不那么重要了, 但编程需要还在啊, 而且图形界面是给普通消费者使用的社会生产工具/商业驱动的结果, 那么就有了现在计算机中软件模拟的终端了: 使用它们, 我们在OS的关怀之下, 让计算机执行一些’直接的’命令程序(如rm text.txt
, 删除一个文件), 而不是通过鼠标’右键-删除’这样的操作.
所以, 软件终端是对以前的硬件终端的模拟, 以前硬件终端对于计算机的操作, 现在在软件终端上都还在实现着: 比如’输入命令让计算机执行程序并返回结果’这个模式, 只不过GUI作为视觉利器, 一直蒙蔽了一部分的想法.
1.为什么命令总有参数
终端命令行是什么? 是系统中的一个软件, 负责将用户的输入(命令)转交给OS让它调度执行.
C语言是怎么来的? Ritchie为了开发一个更好的操作系统(即后来的Unix)而发明的一种语言, 所以, Unix的基础还是C语言.
终端命令是什么? 是C语言程序, 由用户输入, 由终端负责向系统请求执行这个命令/程序.
命令的参数去了哪里? Unix系统的底是C语言, 可执行程序的底更是C语言, 参数由系统打包传递给了int main()
函数.
2.怎么理解命令行的管道符号(’|’)
首先, 得有如下的理解: 现在的软件模拟的终端是一个’轻量级’的脚本解释器: 一方面, 它不像Python解释器那样专门执行某种语言代码, 另一方面, 它解释的程序是一行一行来执行的(但也有跨行的if...fi
条件语句), 再一方面, 它每行的命令是有对应的二进制程序的. 终端这个脚本解释器就是一个用户与系统内核中间地带, 系统启动执行它, 它负责将用户输入的文本(即, 命令及参数)传递给并引起系统调用(执行命令程序), 这一切最终的源头, 则是系统的第一个进程init
.
有了终端是脚本解释器的理解, 则好理解管道符号了(可参考段后例子): 终端首先将管道符号前的一段命令交予系统执行, 将返回的结果转递给管道符号后面的命令(作为其输入), 如果还有更多的管道符号, 也以此类推. 至于这个返回的结果在哪里, 终端并不显示出来, 它在内存中驻留, 我们看不见, 而参数’打包’转递的过程, 本身也是任何解释器’应该’完成的一种任务.
# 解释: 结束所有由vim编辑器启动的进程.
ps -ef | grep vim | awk '{print $2}' | xargs kill -9
本文链接:https://my.lmcjl.com/post/7699.html
4 评论