为什么在提示符下命令可以被执行呢?

执行命令过程

输入命令后回车,提请shell程序找到键入命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来

shell本身也是一个程序,只不过在用户登录过程中已经加载到内存中了。

对shell可以理解为一个工具箱,集成了很多很多的小工具

shell程序对应磁盘文件

[03:05:41 root@C8[ ~]#ll /bin/bash
-rwxr-xr-x. 1 root root 1219248 Nov 8 11:30 /bin/bash

shell中可执行的两类命令

bash里集成的小工具被称为内部命令,所谓的内外是以属不属于bash来判断的

  • 内部命令:由shell自带的,而且通过某命令形式提供
  • 外部命令:在文件系统路径下有对应的可执行程序文件

区别指定的命令是内部或外部命令

type COMMAND
[03:12:01 root@C8[ ~]#type ll
ll is aliased to `ls -l --color=auto' #这是一个别名
[03:49:43 root@C8[ ~]#type hostname
hostname is /usr/bin/hostname #外部命令并显示路径
[03:50:03 root@C8[ ~]#type echo
echo is a shell builtin #内部命令 shell 建立在里边

当用户输入一个命令,系统先判断是否是内部命令,如果不是内部命令,则按照系统环境变量的地址去磁盘上寻找外部命令

搜索外部命令的次序在$PATH中,如果找到了,就加载到内存中执行。

[03:50:16 root@C8[ ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

内部命令随bash已经加载在内存中,执行效率最高。

外部命硬在硬盘上,每次需要找到再执行,这样执行效率很低。

系统策略可以将不久前执行过的命令路径记录在内存中,方便下次使用。

这种行为叫做hash

[03:59:10 root@C8[ ~]#type hostname
hostname is hashed (/usr/bin/hostname)

查看已被hash的外部命令

hits 代表命令被执行了几次

[03:59:23 root@C8[ ~]#hash
hits command
2 /usr/bin/hostname
1 /usr/bin/lscpu
1 /usr/sbin/runlevel
1 /usr/bin/ls
2 /usr/bin/free

help显示内部命令的帮助

help即是帮助,又显示出所有的内部命令

enable 也可以显示内部命令

[04:16:25 root@C8[ ~]#help
GNU bash, version 4.4.19(1)-release (x86_64-redhat-linux-gnu)
These shell commands are defined internally. Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list. A star (*) next to a name means that the command is disabled. job_spec [&] history [-c] [-d offset] [n] or history -anrw>
(( expression )) if COMMANDS; then COMMANDS; [ elif COMMANDS; >
. filename [arguments] jobs [-lnprs] [jobspec ...] or jobs -x comman>
: kill [-s sigspec | -n signum | -sigspec] pid >
[ arg... ] let arg [arg ...]
[[ expression ]] local [option] name[=value] ...
alias [-p] [name[=value] ... ] logout [n]
bg [job_spec ...] mapfile [-d delim] [-n count] [-O origin] [-s>
bind [-lpsvPSVX] [-m keymap] [-f filename] [-q> popd [-n] [+N | -N]
break [n] printf [-v var] format [arguments]
builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir]
caller [expr] pwd [-LP]
case WORD in [PATTERN [| PATTERN]...) COMMANDS> read [-ers] [-a array] [-d delim] [-i text] [>
cd [-L|[-P [-e]] [-@]] [dir] readarray [-n count] [-O origin] [-s count] [>
command [-pVv] command [arg ...] readonly [-aAf] [name[=value] ...] or readonl>
compgen [-abcdefgjksuv] [-o option] [-A action> return [n]
complete [-abcdefgjksuv] [-pr] [-DE] [-o optio> select NAME [in WORDS ... ;] do COMMANDS; do>
compopt [-o|+o option] [-DE] [name ...] set [-abefhkmnptuvxBCHP] [-o option-name] [-->
continue [n] shift [n]
coproc [NAME] command [redirections] shopt [-pqsu] [-o] [optname ...]
declare [-aAfFgilnrtux] [-p] [name[=value] ...> source filename [arguments]
dirs [-clpv] [+N] [-N] suspend [-f]
disown [-h] [-ar] [jobspec ... | pid ...] test [expr]
echo [-neE] [arg ...] time [-p] pipeline
enable [-a] [-dnps] [-f filename] [name ...] times
eval [arg ...] trap [-lp] [[arg] signal_spec ...]
exec [-cl] [-a name] [command [arguments ...]]> true
exit [n] type [-afptP] name [name ...]
export [-fn] [name[=value] ...] or export -p typeset [-aAfFgilnrtux] [-p] name[=value] ...
false ulimit [-SHabcdefiklmnpqrstuvxPT] [limit]
fc [-e ename] [-lnr] [first] [last] or fc -s [> umask [-p] [-S] [mode]
fg [job_spec] unalias [-a] name [name ...]
for NAME [in WORDS ... ] ; do COMMANDS; done unset [-f] [-v] [-n] [name ...]
for (( exp1; exp2; exp3 )); do COMMANDS; done until COMMANDS; do COMMANDS; done
function name { COMMANDS ; } or name () { COMM> variables - Names and meanings of some shell >
getopts optstring name [arg] wait [-n] [id ...]
hash [-lr] [-p pathname] [-dt] [name ...] while COMMANDS; do COMMANDS; done
help [-dms] [pattern ...] { COMMANDS ; }

哈希hash

  • Hash算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是Hash算法。
  • 把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。
  • 简单说就是将任意长度的消息压缩到某一固定长度的消息摘要的函数。

应用举例:

MD5

  • MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。
  • MD5-Hash-文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与加密算法不同,这一个Hash算法是一个不可逆的单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因此,一旦文件被修改,就可检测出来。
  • 简单的说,一个不管多大的文件,通过Hash函数计算出一个固定长度的数字,就相当于这个文件的身份证或dna,如果这个文件改变了,再用Hash算出来的数就改变了,多用于文件校完整性校验。

Linux命令的执行的更多相关文章

  1. pv命令监控Linux命令的执行进度

    pv命令监控Linux命令的执行进度 http://www.techweb.com.cn/network/system/2015-12-14/2241124.shtml yum install -y ...

  2. LINUX 命令定期执行可执行文件

    linux命令将nodejs文件变成可执行文件 在linux中一般我们在运行node文件时用的命令为: node example.js 首先.删除文件后缀,在linux命令下添加可执行权限 mv ex ...

  3. 在Linux命令行执行python命令

    在Linux的命令行执行python的某些命令: [root@centos7 ~]# echo "import sys ;print(sys.path)"|python3.6 [' ...

  4. 使用 pv 命令监控 linux 命令的执行进度

    如果你是一个 linux 系统管理员,那么毫无疑问你必须花费大量的工作时间在命令行上:安装和卸载软件,监视系统状态,复制.移动.删除文件,查错,等等.很多时候都是你输入一个命令,然后等待很长时间直到执 ...

  5. linux命令行执行db2存储过程

    存储过程代码如下: CREATE PROCEDURE proc_sum2(IN n INT,OUT sum INT,OUT j INT) BEGIN DECLARE i INT; ; ; ; WHIL ...

  6. shell脚本linux命令连续执行

    shell命令连续执行的三种方式: 1.命令1:命令2:命令3 依次执行命令,无论前一条命令是否执行成功. 2.命令1 && 命令2 && 命令3 前一条命令执行成功后 ...

  7. &&、()、||决定linux命令的执行顺序

    在执行某个命令时,有时需要依赖前面的命令是否执行成功.假如你想通过ssh命令复制很多数据文件到另外的机器后,删除所有源有文件,所以在删除源有文件之前首先要确定复制是不是执行成功.只要执行复制成功才可以 ...

  8. linux 命令后台执行

    我想把updatedb命令(用于重新建立整盘索引的命令)放在后台运行.因为我不想眼睁睁的看着机器建立索引,我还想编会儿程序呢: # updatedb & [1] 23336 注释:在所要执行的 ...

  9. linux命令后台执行

    fg.bg.jobs.&.nohup.ctrl+z.ctrl+c 命令 一.& 加在一个命令的最后,可以把这个命令放到后台执行,如 watch -n 10 sh test.sh &am ...

随机推荐

  1. 云计算openstack共享组件——时间同步服务ntp(2)

    一.标准时间讲解 地球分为东西十二个区域,共计 24 个时区 格林威治作为全球标准时间即 (GMT 时间 ),东时区以格林威治时区进行加,而西时区则为减. 地球的轨道并非正圆,在加上自转速度逐年递减, ...

  2. 1.8HDFS细节

  3. swagger2注解详细说明

    @Api:用在请求的类上,表示对类的说明 tags="说明该类的作用,可以在UI界面上看到的注解" value="该参数没什么意义,在UI界面上也看到,所以不需要配置&q ...

  4. 关于数学公式Markdown

    打开写博客(这都打不开就...) 再打开"选项". 选"启用数学公式支持"对(以后有用嘻嘻) 在默认编辑器里有Markdown选对. 然后就可以 \[\sum\ ...

  5. 刷题[FBCTF2019]Event

    解题思路 信息收集 打开发现是这样的登陆框,信息泄露,弱口令什么的尝试一下,无果,正常注册登陆 发现需要通过admin用户登陆,并且发现有/flag这样的路由,猜测后台为python编写 抓包发现有看 ...

  6. Spring学习(四)--Spring的IOC

    1.BeaDefinition的Resource定位 (1)直接使用BeanDefinitionFactory 定义一个Resource来定位容器使用的BeanDefinition. Resource ...

  7. 部署项目到服务器 & 搭建博客网站

    搭建博客网站 作为名程序员,或者是网络编程爱好者,拥有一个自己的博客网站再好不过,本篇文章手把手教你部署自己的网站

  8. C++中try&catch

    参考:   https://blog.csdn.net/xueluowutong/article/details/81257654 在c++中,可以直接抛出异常之后自己进行捕捉处理,如:(这样就可以在 ...

  9. Java 生态碎片化 和 .NET生态的一致性

    .NET Core是以MIT协议开源, Java是GPL协议开源.Java 8 SDK升级Oracle要收费这件事对于很多小公司是有着重大的影响的,Java生态越发碎片化,有众多的OpenJDK发行版 ...

  10. K8S-ETCD数据库备份与恢复

    kubernetes使用etcd数据库实时存储集群中的数据,安全起见,一定要备份 需要指定使用etcdctl的版本 etcd数据库备份是使用数控快照的方式进行备份的,备份后的新数据不会保留,后面创建的 ...