如何正确看待Linux下的各种命令 / 指令呢?
先讲结论:Linux下的各种命令,本质就是可执行程序!!!
在很多刚接触 Linux 的伙伴们,对于我们平时使用的各种 Linux 命令,可能大部分人的理解就是,命令就是指令。再深入一些,可能可以理解到命令就是工具 这么一个概念(来帮助我们实现 Linux的各种操作,如同我们在windows下一样)
这篇文章呢,我将对linux下的各种命令,指令也好,工具也罢,来谈谈自己的一个理解。
命令,就是指令,是用于指导Linux下的各种系统操作的
那指令是拿来实现 Linux 系统的各种操作 的一种工具(就如同,在windows平台下的各种双击,右键等操作)
所以也就是,命令就是指令,也是工具!!!
可是大家有没有想过,Linux 的 which 这条命令是在干什么呢??
==》
有人说了,which 就是在系统路径中,去查找 特定的指令 所在的路径 !!
==》
没错!那… ls 、pwd、less 等等这些指令,为什么还有所谓的路径呢???它不就是一个命令,一个指令,一个工具而已吗???
==》
怎么指令,还能有路径???路径不应该是拿来记录 实体文件 在磁盘中的位置的吗???
所以在这篇文章,对于Linux下的所有命令,我将提出另一个理念,那就是Linux下的各种命令,本质上就是可执行程序!!!
大家有没有想过这么一个问题,我们平常编写的 C / C++代码,编译器进行编译之后,形成的是什么呢???
大家应该都知道,会形成一个 .exe 的文件,并且,它是可以被打开的!也就是所谓的 可以被执行的文件!!
那么,我们就将其称为 可执行程序!!!
讲到这里,可能有人还是会有很大的疑惑,你说,windows下,这些可执行程序,我还能够理解,但是你这…Linux下的这各种命令,我都看不见摸不着的,它怎么就一下子从 命令 / 指令 变为 可执行程序了呢???
那到底什么是可执行程序呢???以 windows 平台为例,桌面上我们所看到的软件图标,它是可执行程序吗??
==》
是的,它是可执行程序。那它是软件吗???
==》
确切来讲,它不是软件!它只是 软件开发商 为我们上层用户所提供的一个 可以执行这个程序的 快捷方式 而已!!!
我们以 windows平台为例,我们查看 软件图标,我们可以看到,它只是一个 .exe 的可执行程序而已,而桌面上这个图标,仅仅是这个可执行程序的 一个快捷方式 而已!!
我们右键图标,打开文件所在位置
我们可以看到,它确确实实就是,edge这个浏览器软件 的一个可执行程序 而已。
而这个可执行程序,它有路径!!!(记住这句话)
Ok,回过头,我们可能大概可以清楚,所谓的 Linux下的各种命令,为什么本质是可执行程序了,又为什么可以 which 一个系统命令
==》
可执行程序它是有路径的,而which 一个系统命令,它却可以像查找文件一样,将这个系统命令的路径显示出来
==》
所以我们知道了 Linux下的各种指令,它有路径的,就如同可执行程序一样!!所以我们可以初步猜测,它!就是可执行程序。
OK, 我们赶紧总结类比一下,我们在 Linux 下敲击的各种命令、指令,它的作用 就是相当于我们在双击windows的某个可执行程序(或者快捷方式)!!
回过头,我们再看看,我们用 C / C++ 编译出来的各种 可执行程序 .exe 和 Linux的 各种可执行程序(各种命令)有什么区别呢????
答案是:在功能上,可能千差万别,但是在定位上:它们都是一样的!!!都是可执行程序!!!
==》
再然后,我们回过头来看待,所谓 win 或者 Linux 下的各种安装软件,无非就是 软件开发商 将开发好的软件程序编译好之后 形成的可执行程序,还有一些程序的配置文件等等,拷贝到你自己的电脑里。
==》
那么这样一来,好像,所谓的安装??看起来也就那么回事,也没有很高大上的感觉了???它更多的不就是拷贝吗???拷贝完,给你提供一个方便你的东西 —— 快捷方式,你咔咔两下双击,就能运行这个软件了。
那么一个程序,我们把它安装到我们的系统里了,那我们要运行一个程序,无外乎就是两件事
1、找到它
2、运行它
所以我们在Linux下,可以直接 ls 或者 pwd 等等各种指令,就可以执行这些指令,然后以此来达到各种作用!
但是,对于我们在 Linux下所编译好的各种 c/c++ 的可执行程序,我们却需要 ./a.out
,才能够运行它。
==》
现在,大家应该需要清楚,这是为什么??
==》
因为运行一个程序,需要先找到它,才能运行它。 ./a.out
中的 . 表示的就是,”在当前路径“ ,那既然是路径,那不就是在找它吗!!! ==》 . 之后 再加一个 / 不就是运行的意思吗。如果 . 之后,找到了我们要的这个程序,不就可以正常被运行吗;而运行后如果报错了,那是不是换言之,就是,我(系统)没有找到你要的这个程序!!!(当然,也有因为权限的问题,导致无法运行)
实操结果,我们也确实可以看到,直接运行编译好的cpp文件,因为它不是系统指令,所以没有它的路径,我们需要显式的告诉系统,它的路径在哪,也就是需要 ./a.out 才能运行 这个编译好的可执行程序
而我们的各种系统命令,它也是可执行程序,可为什么不需要 ./ 来运行它呢???
==》
我们现在也应该需要清楚这个问题的答案。因为它是系统的命令,Linux已经将其路径配置在系统文件当中了,所以运行 ls、pwd等系统命令的时候,系统就默认知道了它的路径,所以不需要我们指定!
现在大家想想,可能小时候,我们都干过这么一件事,当我们想要删除某个软件的时候,我们在桌面上,把它的图标拖到回收站,然后咔的一下清空了。请问,这个软件,真的删除了吗???
==》
答案肯定是没有!它只不过呢,是在桌面上,找不到它了而已!!也就是只是解决了,”找到它“ 这个问题而已!!!
OK,我们上面不是谈论到,运行一个程序,我们需要先找到它,再运行它吗
==》
我们现在再回头看,Linux 的 which 指令,它是在干嘛??!
==》
它(which)不就是在做 “找到它” 这件事吗?!!
我们可以看到,which ls 就把 ls 这个指令 所在的路径 显示打印在屏幕上了
猜测一:
既然 /usr/bin/ls 这个路径 就是代表 ls 这个指令所在的路径,而 ls 是用来显示 当前路径下 所有非隐藏文件的 文件名的!!
==》
而windows下,可以通过双击一个程序的快捷方式来执行这个程序
那么我假设,直接敲击 ls 就是执行 ls 的一种快捷方式
==》
而我在windows下 对桌面图标右键所在位置,就可以到达它的具体路径,在它的路径下,我可以去执行它这个可执行程序,而这个效果,跟我在桌面上直接双击运行这个程序的快捷方式,是不是也是一样的呢!!!
==》
那么我运行 ls 的路径 ” /usr/bin/ls “,那是不是也应该可以达到直接运行 ls 一样的效果????
证明一:
答案是:没错,运行 ls 的路径 跟 运行 ls 的效果没有一点区别!!!
我们通过 which 找到了 ls 的路径,然后我们直接执行它的路径,可以看到,他跟直接执行 ls 这条指令,没有任何的区别,效果是一模一样的!!!!
再次对比总结:在windows下,我们可以通过快捷方式找到某个可执行程序的路径。我们可以双击桌面的快捷方式,达到访问这个可执行程序,我们也可以在路径里面访问这个可执行程序。
==》
在 Linux 下,我们通过 which 指令就可以找到 ls 这个指令的路径。我们可以直接执行 ls 这条命令,来达到 ls 的作用(显示当前路径下所有非隐藏文件的文件名),我们也可以通过直接执行 ls 的路径 来达到 ls 的效果。那么,我们是不是可以初步证明,ls 的本质就是一个可执行程序!!!
猜测二:
ls 是用来查找 当前路径下 所有非隐藏文件的 文件名,那我是不是可以通过执行 ls 来查看它自己路径下的文件名呢???
那如果 ls 是一个可执行程序,那它肯定有名字吧?那它是不是应该被显示打印出来呢?就如同普通文件或者目录一样。
ls 显示的是文件名,而此时,ls 自己被显示出来了,那也就是说,我们起码能够证明,ls 是一个文件!!
==》
只有文件才有所谓的路径,而 ls 它是一个文件,而它又是一个可以被执行的文件,那这样,不就可以说,它就是一个可执行程序了吗 ??
==》
所以,我们从刚刚的初步证明 ls是一个可执行程序,再一次证明了 ls 是一个可执行程序
我们前面的两个猜测推断,都得到了验证。我们的猜测结果,也都跟我们的实操结果是一模一样的!
我们 ls -l /usr/bin/ls,我们可以看到,ls它就是一个程序,叫做 ls
然后我们在对其路径 file 一下,我们可以看到 Linux给它的描述是,executable – 可执行的!
所以经过三次证明,我们断定! ls 本质 就是一个 可以被执行的 程序,也就是 可执行程序!!!
所以呢,看到最后,大家心底也都有个五六成了,也大概可以知道,为什么 Linux 下的各种命令,本质都是可执行程序?我们先是与大家谈了 什么是命令,随即通过 Linux 的 which 指令,引入了一个叫做 ”路径“ 的概念,进而由路径,引入了 “可执行程序” 的概念,并在windows平台下,带大家理解了什么是可执行程序,可执行程序 与 路径 的关系,还有 快捷方式 的引入,等一系列的概念,在概念层面上 证明了 Linux下的命令本质就是可执行程序。最后呢,我们讲了运行程序所需要具备的两个因素,找到它,然后再运行它。而Linux的which 做的就是找到它这么一件事,而运行它,是系统层面需要做的事情。找到它之后,我们顺势的进行了一系列的猜测,并且实操来证明我们的猜测,最后的出来的结论就是,Linux下的各种命令,本质就是可执行程序!!!
OK,本期文章到这里就结束了。如果能给你带来一定的帮助,或者是收获,我很开心。
同时,觉得对你有帮助的伙伴们,也可以 点赞 + 收藏⭐️ + 关注➕ 支持一下!
感谢各位观看!!