文档章节

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

l
 linux-tao
发布于 2017/04/24 10:38
字数 1396
阅读 17
收藏 0
点赞 0
评论 0

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

我们都知道,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
粉丝 9
博文 567
码字总数 642105
作品 0
深圳
运维
教你用 google-drive-ocamlfuse 在 Linux 上挂载 Google Drive

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

linuxprobe ⋅ 2016/08/04 ⋅ 0

Shell 历史记录异地留痕审计与监控

Shell 历史记录异地留痕审计与监控 http://netkiller.github.io/journal/shell.history.html 版权 © 2014 http://netkiller.github.io 2014-12-25 目录 1. 什么是Shell历史记录异地留痕与监...

neo-chen ⋅ 2014/12/24 ⋅ 0

新手写作应该写点什么呢?

随着新媒体的火热,越来越多的人加入到新媒体写作当中,而写作从来不是一件一蹴而就的事情,新手刚开始写作,都会遇到一个共同的疑问?应该写点什么呢? 应该写点什么呢? 写故事 首先推荐文...

angkee ⋅ 2017/12/04 ⋅ 0

使用grep恢复被删文件内容

在Unix/Linux下,最危险的命令恐怕就属rm命令了,每次在root下使用这个命令的时候,我都要盯着命令行看上几分钟才敢把回车敲下去。以前,看到同事在脚本中使用rm命令 —— 。因为脚本没有判断...

芒果龙 ⋅ 2011/12/08 ⋅ 0

linux学习之旅(七)&& 进程间通信之信号

信号机制 1.进程定义 进程就是cpu未完成的工作,是对正在运行的程序过程的抽象。 进程的几个特性: 并发性:任何进程都可以同其他进程一起并发执行 独立性:进程是一个能独立运行的基本单位,...

mon_star ⋅ 2017/07/23 ⋅ 0

Linux上挂载Google Drive的办法

Linux上挂载Google Drive的办法 如果你在找一个方便的方式在 Linux 机器上挂载你的 Google Drive 文件夹, 下面兄弟连教育将教你怎么使用 google-drive-ocamlfuse 来挂载 Google Drive。Goo...

小贱1991 ⋅ 2016/08/05 ⋅ 0

spring boot启动遇到蹊跷的问题,绝对的蹊跷

环境是sts,spring boot版本是1.5.9,工程非常简单,就一个controller,helloworld级别的,通过sts工程自带的spring boot app启动 sts启动要花费60s以上,找遍网上解决方案都是通过配置urand...

南城爷们 ⋅ 01/07 ⋅ 8

Mac OS 账户管理员权限丢失恢复方法

情况说明 一些 Mac 新手在更改账户名的时候经常可能因为操作失误导致原账户的管理员权限丢失的问题发生(这里不得不吐槽下苹果的官方文档,官方文档对于账户名更改的流程介绍过于简单,极其容...

叶俊贤 ⋅ 04/18 ⋅ 0

Ubuntu12.10将应用程序添加到启动器

安装了eclipse,为了使用起来方便,需要将eclipse图标添加到Dash,类似于Windows下创建桌面快捷方式,通用方法如下: 1.终端下,敲下如下命令: cd /usr/share/applications2.编辑文件: vi...

陈佳庆 ⋅ 2013/01/20 ⋅ 0

合并几个commit为一个commit

将多次commit合并,只保留一次提交历史。 1.首先使用git log查看一下提交历史 [demo@ubuntu1204:zh_cn(bugfix/ycs-MOS-1503-notify-template-table-center)]$ git logcommit 5e187c7dbe84af6......

大道至精 ⋅ 2016/03/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

线程池

一、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。 二、线程池的体系结构: java.util.concurrent.Executor : 负责线程的使用...

stars永恒 ⋅ 21分钟前 ⋅ 0

你值5K还是15K?实战案例,测测你的分析功力

本文源自陈老师遇到的真实案例。 老板说:“我们今年准备参加展会,做一年。以前我没参加过,没关系,这里有一份展会数据,你回去分析下哪些有价值,后边组织的时候有个指导”。现在你收到任...

加米谷大数据 ⋅ 23分钟前 ⋅ 0

中文转英文功能

package com.sysware.task.util;import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;import net.sourceforge.pinyin4j.for......

AK灬 ⋅ 24分钟前 ⋅ 0

JNI Java层类关联C/C++层的类

Android开发时,因为要实现某某功能,需要集成算法公司的算法库(so库),这就需要自己编写JNI。 通常这些库提供的接口可以概况成1、初始化 2、算法处理 3、释放 4、打印版本号 初始化后会返...

国仔饼 ⋅ 27分钟前 ⋅ 0

maven下载jar包改为阿里云的maven库

一:修改maven安装路径中conf文件夹下的setting.xml文件 <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/......

夜醒者 ⋅ 28分钟前 ⋅ 0

电商用户行为分析大数据平台相关系列10-基础数据结构分析

电商用户行为分析大数据平台相关系列1-环境介绍 电商用户行为分析大数据平台相关系列2-HADOOP环境搭建 电商用户行为分析大数据平台相关系列3-HIVE安装 电商用户行为分析大数据平台相关系列4...

xiaomin0322 ⋅ 29分钟前 ⋅ 0

使用readLine()方法遇到的坑

下午玩 TCP/IP 的 Socket 通信时,使用 BufferedReader 的 readLine() 遇到了一个坑,现在终于解决了,特此记录下来。 程序很简单,客户段从控制台读取用户输入,然后发送至服务器端,主要代...

孟飞阳 ⋅ 29分钟前 ⋅ 0

基于Hadoop集群的Hive安装配置(Derby数据库)

Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据,提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行(具体的Hive架构大家自行搜索)。接下来主要讲下Hadoop集群下...

海岸线的曙光 ⋅ 30分钟前 ⋅ 0

CoreOS裸机iso安装和相关配置

裸机通过iso安装CoreOS,个人趟了很多坑,以下就是完整的从零开始部署和配置的过程,希望对大家有用。 一、安装CoreOS到硬盘 1. 准备Live iso镜像,制作好usb启动盘 Live iso下载地址 2. 搭建...

ykbj ⋅ 35分钟前 ⋅ 0

jquery控制表格锁列(转)

表格已经完成后新加的需求,要实现锁表格的第一列。很多带这种效果的都是js封装的框架或者具体某种框架的组件,不适用解决当前问题。作为后端开发又实在不熟样式,搜到了一个可以用的,虽然样...

刘昌鑫 ⋅ 37分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部