文档章节

当你敲下命令的瞬间,发生了什么?

l
 linux-tao
发布于 2017/04/24 10:38
字数 1396
阅读 123
收藏 0

精选30+云产品,助力企业轻松上云!>>>

日常工作中,我们总是在敲命令,但是有没有思考当我们敲下命令的瞬间,我们的操作系统为我们做了什么呢?下面我们主要讲一讲当我们敲下命令按了回车,系统做了什么事情。希望可以让我们对于系统的理解更加深入。

我们都知道,linux里面一切都是文件,那么其实我们敲的命令也不例外,命令也是文件。那当我们敲下比如“pwd”命令的时候,发生了什么事情呢?

1、了解shell

计算机硬件是由运算器、控制器、存储器、输入输出设备等设备组成的,而能够让机箱内各种设备各司其职的叫做系统内核。系统内核负责驱动硬件、管理活动和分配/管理硬件资源,它对于计算机太重要了,所以不可以让用户直接操作。

因为用户不能直接控制硬件,也不能直接操作系统内核,于是便需要基于“系统调用接口”开发出的程序/服务来满足用户的日常工作,那么shell就是人与硬件之间的翻译官。

用户将一些命令“告诉”Shell,它就会调用相应的程序服务执行工作啦,很厉害吧~~现在包括红帽系统在内的许多热门Linux系统主流默认字符Shell是Bash(Bourne-Again SHell)。

bash拥有以下四点优点:

1.通过上下方向键来调取过往执行过的命令。
2.命令或参数仅需输入前几位就可以用tab键补全。
3.强大的批处理脚本。
4.实用的环境变量。

2、检查命令的路径

比如我们写一个“ls”命令给系统,系统如何知道我们写的这个命令是什么意思呢?

首先,第一步骤阶段是判断用户是否以绝对路径方式输入命令。如果是绝对路径(如/bin/ls)的话则直接执行。如果不是的话,系统就直接进入下一步的判断。

3、别名命令?

然后,系统会判断是不是别名命令。即用一个自创的命令名称来替换原本的命令名称。

咱们可以用alias命令来创建自己的命令别名,格式为:“alias 别名=命令”,若要取消一个别名的话则是用unalias命令,格式为:“unalias 别名”。

例如咱们以前用rm命令删除文件的时候都要被要求再确认是否执行删除操作,其实这就是Linux系统为了防止用户误删除文件而特意设置的rm别名命令,咱们可以将它取消掉:

[root@localhost ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
[root@localhost ~]# rm anaconda-ks.cfg 
rm: remove regular file ‘anaconda-ks.cfg’? y
[root@localhost ~]# alias rm
alias rm='rm -i'
[root@localhost ~]# unalias rm
[root@localhost ~]# rm initial-setup-ks.cfg 
[root@localhost ~]#

4、内部/外部命令?

然后,就是由SHELL解释器(Bash)来判断用户输入的是内部命令还是外部命令。

所谓的内部命令是解释器内部的指令(在启动时就调入内存的,执行效率高),会被直接的执行,而绝大部分的时候都会是外部命令(系统的软件功能,用户需要时才从硬盘调入内存的),交由给第四步骤来继续处理,当然您还可以使用“type 命令名称”来手工判断是内部命令还是外部命令,也是很有趣的。

5、查找命令

当bash判断该命令是外部命令的时候,我们需要系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫做PATH,可以简单把它理解成是“解释器的小助手”,作用是告诉解释器要执行的命令可能存放到了那里,然后bash就会乖乖的在这些目录中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,咱们对这些路径的增加和删除操作就是在直接影响bash解释器搜索linux命令的位置。

[root@linuxprobe ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
[root@linuxprobe ~]# PATH=$PATH:/root/bin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin

经典问题:为什么不能在$PATH中添加进当前目录(.)那?

虽然将$PATH变量添加了当前目录(.)会在一些情况让用户免去输入命令所在路径的麻烦,但如果黑客在比较常用的公共目录/tmp中存放了一个名为"ls"或"cd"的同名木马文件,那么用户就极有可能错误的执行了。

所以作为一名谨慎的、有经验的运维人员在接手了一台Linux系统后一定会在执行命令前先检查下PATH变量中是否有可疑的目录,您可以使用env命令来查看到linux系统中所有的环境变量。

本文原创地址:http://www.linuxprobe.com/what-happened-click.html

l
粉丝 21
博文 1008
码字总数 1130720
作品 0
深圳
运维
私信 提问
加载中
请先登录后再评论。
利用xshell工具打开Centos中的eclipse

最近编码python,需要在工作站上配置Linux加eclipse的开发环境,考虑到Centos Server版本里面,没有安装桌面,之前的方法,是在Centos Server版本里加装桌面,方法如下: 1.保证主机可以连入...

榫眼宾
2018/07/30
98
0
MySQL学习【第十一篇存储引擎之事务解释】

一.innodb的核心特点------事务 1.什么是事务 在一组数据操作执行步骤,这些步骤被视为一个单元,主要针对dml语句(update、delete、insert) 2.事务ACID特性 Atomic(原子性) 所有语句作为...

osc_7hvnvgh9
2019/03/25
2
0
恢复不小心误覆盖的代码文件 (sublime编辑器)

最新写了一个python脚本,另外在终端上运行一个shell脚本循环记录一些性能、耗时参数。取出记录的数据,使用python pyplot强大的绘图功能来可视化,易用程度仅次于matlab。本次文件覆盖杯具前...

osc_oajhjcoo
2018/01/03
8
0
教你用 google-drive-ocamlfuse 在 Linux 上挂载 Google Drive

如果你喜欢界面化的工具,你可以选择 Insync。如果你喜欢用命令行,有很多像 Grive2 这样的工具,以及更容易使用的以 Ocaml 语言编写的基于 FUSE 的文件系统。我将会用后面这种方式演示如何在...

linuxprobe
2016/08/04
61
0
深入学习Composer原理(一)

Composer作为PHP的包管理工具,为PHPer们提供了丰富的类库,并且让PHP重焕新生,避免被时代淘汰的悲剧。可以说,Composer和PHP7是现在PHP开发者的标配,如果你还没用过Composer或者在PHP7的环...

硬核项目经理
2019/03/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

将字符串拆分为具有多个单词边界定界符的单词 - Split Strings into words with multiple word boundary delimiters

问题: I think what I want to do is a fairly common task but I've found no reference on the web. 我认为我想做的是一项相当普通的任务,但是我在网络上找不到任何参考。 I have text ...

fyin1314
28分钟前
9
0
jQuery选择器中的通配符 - Wildcards in jQuery selectors

问题: I'm trying to use a wildcard to get the id of all the elements whose id begin with "jander". 我正在尝试使用通配符来获取id以“jander”开头的所有元素的id。 I tried $('#jand......

法国红酒甜
58分钟前
19
0
唐山5.1级地震 百度人工智能技术帮上忙:成都减灾所提前30秒让北京、天津市民收到预警

本文作者:y****n 7月12日6时38分在河北唐山市古冶区发生5.1级地震,成都高新减灾研究所与应急管理部门联合建成的大陆地震预警网成功预警该地震,给唐山市提前3秒预警,给天津市提前33秒预警...

百度开发者中心
昨天
30
0
如何使用PHP发送POST请求? - How do I send a POST request with PHP?

问题: Actually I want to read the contents that come after the search query, when it is done. 实际上,我想阅读搜索查询之后的内容,完成之后。 The problem is that the URL only a......

javail
今天
14
0
如何从Java读取文件夹中的所有文件? - How to read all files in a folder from Java?

问题: 如何通过Java读取文件夹中的所有文件? 解决方案: 参考一: https://stackoom.com/question/7jt2/如何从Java读取文件夹中的所有文件 参考二: https://oldbug.net/q/7jt2/How-to-rea...

富含淀粉
今天
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部