LINUX——命令实现原理

一、前情提要

在了解linux中各种命令是如何实现的原理之前,首先要了解一些基本概念包括: 什么是终端(terminal),什么是shell以及他们之间是如何运行工作的。

  • 终端(Terminal)是对字符输入输出设备的抽象,在Linux中terminal是一种特殊的文件,在/dev目录下。通常情况下,键盘输入会写这个文件,而对应的终端驱动程序会执行诸如回显的工作(可以通过stty改变驱动程序的默认行为),如果没有了terminal,那么就无法响应键盘的输入。
  • shell的本质是一个命令解释软件,这个软件中可以通过fork + exec + wait去加载别的可执行程序并运行。如果没有了shell,那么我们输入’ls’的时候,只会回显’ls’字符,并不会执行ls这个程序,所以shell的工作就是解析我们的输入字符,并执行对应的指令。
  • Terminal和shell之间有什么关系呢?当我们去运行shell软件的时候,shell的stdin、stdout和stderr会打开并指向一个特定的terminal文件,这样导致我们通过键盘的输入实际上是写到terminal文件里面,但是shell会通过他的stdin从这个terminal文件中读到。

二、命令执行方式

在Ubuntu中默认使用的shell是bash,当我们打开一个终端时就会启动bash接下来你输入的命令字符串会通过terminal传递给bash运行。通常bash执行指令的 方式有三种:

  1. 绝对路径执行,通过指定要执行的命令脚本的路径+命令文件,列/home/bin/la.sh
  2. sh执行,指的是用脚本对应的sh或bash来接着脚本执行,例 sh test.sh
  3. shell环境执行,指的是在当前的shell环境中执行,可以使用 . 接脚本 或 source 接脚本
    三种方式的区别在于:使用前两种方式会使用一个新的bash子进程来执行如下图所示:LINUX——命令实现原理_第1张图片
    使用第三种方式则是在当前bash中国直接执行该命令
    LINUX——命令实现原理_第2张图片

三、命令定位

通常我们执行指令采用的都是方式一:绝对路径执行,有人可能会说自己在输入指令时并没有输入具体指令所在的路径bash是如何执行的呢。这是因为linux把一些常用的指令的可执行文件直接打包在了某些特定位置,并将这些位置写入了全局变量,在bash执行某一不知道位置的指令时就会对全局变量PATH中所包含的路径进行搜索。

自定义脚本/指令的执行

若我们想在bash中执行一些 自己定义的指令或脚本我们应该如何定位到他们呢?
首先我们可以直接输入据对路径执行具体指令,如果是一些经常用的指令觉得路径输入太麻烦,可以尝试修改环境变量PATH,修改环境 变量方式有三:

  1. 临时修改环境变量, 直接在命令行中输入PATH=$PATH:/etc/apache/bin。这种方法只对当前bash有效,一旦重新开启一个新的bash会恢复原来的变量值。
  2. 修改/etc/profile文件。在/etc/profile文件的适当位置添加PATH=$PATH:/etc/apache/bin (注意:=即等号两边不能有任何空格)。这种方法最好,除非你手动强制修改PATH的值。否则将不会被改变。
  3. 修改用户目录下的.bash_profile:vi ~/.bash_profile,把用户想添加的路径添加到PATH后面。这种方法只针对用户起作用。 注意:若采用修改profile文件的方法改变PATH,则必须重新登录才能生效。
    除了上述方法其实还有第四种方法,我们可以通过在.bashrc文件设置命令别名,将原本需要绝对路径的命令起一个短的命令别名
    例:alias myname=’/home/myfile/myname.sh’

你可能感兴趣的:(linux入门)