什么是linux命令

什么是linux命令?很多人看到这个问题,都会不以为意,认为这不算是一个问题。很多人都知道命令是什么,但是对于刚接触linux的朋友来说,还是对命令有很多困惑。我们在linux命令行下敲的命令,最终会被计算机执行,这中间发生了什么?背后的原理是什么?这是我在最开始学习linux的时候困扰最久的问题。当然这些问题不是一篇文章就可以解释的了的,这需要对计算机原理、linux内核有深入的了解,才能写出完美的答案。

linux企鹅

但是我们可以先了解一下基础的原理,这样在实践命令的时候才会有更好的效果。下面我讲解一下自己对命令的理解。

我们在命令行下敲命令的时候,其实是在跟一个叫shell的程序打交道,shell会根据用户敲的命令名字,在环境变量PATH指定的路径下寻找和命令名字匹配的一个可执行文件,找到后shell会创建一个子进程,在子进程中加载并执行该可执行文件。所以我们平时敲的大部分命令都是一个已经存在的可执行文件,那么这个可执行文件放在哪里呢,通过whereis就可以看到命令所对应的可执行文件的路径了,例如要看看ls这个命令在哪里,就执行

whereis

ls就可以看到ls的路径了。如果你把这个文件删掉,那么shell就会告诉你找不到这条命令。大部分命令都是一个可执行文件,但是我们在用whereis查看cd命令的可执行文件路径的时候,shell的输出是这个样子的:“cd:”,竟然没有路径名,这是什么鬼?

这是因为cd是shell的一个内置命令,不以可执行文件的形式存在。所以咱们平时敲的命令主要分为两种,一种是以可执行文件存在的外部命令,一种是没有可执行文件的内置命令。这里的外部和内置是从shell的角度说的。那么怎么判断一条命令是shell内置命令还是外部命令呢,用type查看就可以了,比如查看cd,在命令行下敲type

cd,shell的输出是cd is a shell builtin。那么cd就是一条shell内置命令。

说了这么多,好像还没有解释shell是什么东西,简单来讲,shell就是一个命令解释器,shell和咱们敲的这些命令都是一样的,都是运行在linux内核之上的应用程序,在内核的眼里都是内核要调度执行的进程。这些进程在运行之前,都是一个一个的可执行文件。只是shell是在linux启动之后就会由init进程自动加载执行的。他也对应着一个可执行文件。可以通过查看/etc/passwd文件中每条记录的最后一个字段查看每个用户在启动后执行的shell可执行文件路径,也可以通过SHELL环境变量查看当前启动的shell。echo

$SHELL

那么上面提到的环境变量又是什么东西呢?可执行文件是什么?他从哪里来?是怎么被加载到内核中变成一个可调度的进程的呢?shell是怎么创建子进程的呢?进程又是什么鬼?shell是被init进程启动,init(systemd)进程又是什么?linux的启动流程是怎么样的?进程是如何被内核调度的?说到这里,好像问题越来越多了,本来只是一个命令的问题,现在又引出这么多问题。技术就是这样,知道的越多,不知道的也就越多。欢迎关注本头条号,我会在后面的文章持续为大家解答这些问题。本人水平有限,欢迎批评指正。

你可能感兴趣的:(什么是linux命令)