Linux命令的执行

Posted 白_胖_子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux命令的执行相关的知识,希望对你有一定的参考价值。

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

执行命令过程

输入命令后回车,提请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命令的执行的主要内容,如果未能解决你的问题,请参考以下文章

Linux bash基础特性二

-bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory(代码片段

linux中怎么查看mysql数据库版本

谢烟客---------Linux之bash脚本编程---if补充和for循环

markdown [Docker] Docker片段列表和命令#linux #docker #snippets

VSCode自定义代码片段——cli的终端命令大全