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

命令的语法通用格式 : COMMAND OPTIONS ARGUMENTS ,发起一个命令相当于请求内核将某个二进制程序运行为一个进程。 命令本身是一个可执行程序的二进制格式的文件。这个程序有可能会调用共享库文件。所有可执行程序同时需要特定的格式规范: exe,msi,ELF(linux)。 多数程序文件都存放在 : /bin,/sbin/,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin

共享库 : /lib,/lib64,/usr/lib64,/usr/local/lib,/usr/local/lib64

并非所有命令都有一个在某目录与之相对应的可执行程序文件

~]#file /bin/ls  
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs),
for GNU/Linux 2.6.32, BuildID[sha1]=3d705971a4c4544545cb78fd890d27bf792af6d4, stripped

1. 类型

linux系统为了提高系统运行效率, 将经常使用的轻量的命令在系统启动时一并加载这些命令到内存中供shell随时调用 , 这部分命令即为内部命令。反之 , 系统层调用的较重的命令只有当被调用时才会被硬盘加载的这部分命令即为外部命令

shell中可执行的命令有两类:

  • shell程序自带的命令 : 内置命令(builtin) 。内部命令 实际上是shell程序的一部分 , 其中包含的是一些比较简单的linux系统命令 , 这些命令由shell程序识别并在shell程序内部完成运行。

  • 外部命令 : 在文件系统路径下有对应的可执行程序文件。外部命令linux系统中的实用程序部分 , 因为实用程序的功能通常都比较强大 , 所以其包含的程序量也会很大 , 在系统加载时并不随系统一起被加载到内存中 , 而是在需要时才将其调用内存。通常外部命令的实体并不包含在shell中 , 但是其命令执行过程是由shell程序控制的。shell程序管理外部命令执行的路径查找、加载存放 , 并控制命令的执行。

区分内部命令或者外部命令可以使用type命令,type COMMAND

范例 : 查看是否存在对应内部和外部命令

[root@localhost ~]# type ls
ls is aliased to `ls --color=auto'
#ls为外部命令
​
[root@localhost ~]# type pwd
pwd is a shell builtin
#pwd为内部命令

环境变量 : 环境变量是具有特殊名字的一个特定对象 , 包含了一个或多个应用程序运行所需的信息。 PATH : 从哪些路径中查找用户键入的命令字符串所对应的命令文件。

1.1 内部命令

该小节中主要是介绍linux中内部命令相关的两个命令:helpenable

  • help :直接在linux命令栏中输入help,可以直接显示本shell中所有的内部命令

  • enable : 用于启动或关闭 shell 内部指令。

    • enable : 查看所有没有禁用的内部命令

    • enable command : 启用内部命令

    • enable -n command : 禁用内部命令

    • enable -n : 查看所有被禁用的内部命令

内部命令在系统启动时 , 直接运行对应的shell , 直接内嵌于shell中 , 所以在系统运行时 , 直接在内存中 , 如果系统重启或重新登录之后 , 被禁用的命令会直接恢复

1.2 外部命令

可以使用which或者whereis查看外部命令在linux中的位置

  • whereis : whereis命令用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。

    • -b : 只搜索二进制文件

    • -B <目录> : 只在路径下查找二进制文件

    • -m : 只搜索man手册

    • -M <目录> : 只在路径下查找man手册

    • -s : 只搜索源码文件

    • -S <目录> : 只在指定路径下查找源码文件

    • -f 终止目录列表和文件开头信号(其实就是结尾符号)。使用-B , -M , -S选项时 , 必须使用。

    • -u : 仅显示具有异常项的命令名。

    • -l : 输出有效查找路径

    [xf@xuexi ~]$ whereis cd
    cd: /usr/bin/cd /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
    [xf@xuexi ~]$ whereis -b cd
    cd: /usr/bin/cd
    [xf@xuexi ~]$ whereis -B /usr/ -f cd
    cd: /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
    [xf@xuexi ~]$ whereis -s cd
    cd:
    [xf@xuexi ~]$ whereis -S /usr/ -f cd
    cd: /usr/bin/cd /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
    [xf@xuexi ~]$ whereis -m cd
    cd: /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
    [xf@xuexi ~]$ whereis -M /usr/ -f cd
    cd: /usr/bin/cd

  • which : which命令用于查找文件,which指令会在环境变量$PATH设置的目录里查找符合条件的文件。

    [root@localhost ~]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@localhost ~]# which --skip-alias ls
    /usr/bin/ls
    [root@localhost ~]# which  ls
    alias ls='ls --color=auto'
        /usr/bin/ls
    [root@localhost ~]# 

1.3 Hash缓存表

系统初始hash表为空 , 当外部命令执行时 , 默认会从PATH路径下寻找该命令 , 找到后会将这条命令的路径记录到hash表中 , 当再次使用该命令时 , shell解释器首先会查看hash表 , 存在将执行之 , 如果不存在 , 将会去PATH路径下寻找 , 利用hash缓存表可大大提高命令的调用速率。

hash 显示hash缓存
hash -l 显示hash缓存 , 可作为输入 
hash -p path name将命令全路径path 起别名为name
hash -t name 打印缓存中name的路径 
hash -d name 清除name缓存 
hash -r 清除缓存

注: 如果运行命令路径有问题 , 可以通过hash -d COMMAND来删除命令在内存中的缓存

type 是通过查看hash内存缓存中的命令路径 , 如果没有直接在硬盘对应文件中查找 , 而which直接从硬盘文件中查找 ,在硬盘文件中如果找到了 , 则停止搜索 , 并将对应的路径打印出来。 which -a 搜索硬盘文件中的所有路径 , 并将包含这样命令的路径全部打印出来

2. 命令别名

可以让我们将一些需要频繁使用的但又过于冗长的命令设置一个别名 , 以后只需输入一个简短的别名就可以达到同样的作用。当linux中使用别名时,需要直接使用命令 : alias

alias语法如下 :

alias [-p] [name[=value] ... ]

显示当前shell进程所有可用的命令别名

alias

定义别名NAME , 其相当于执行命令VALUE

alias NAME='VALUE'
  • 使用该指令可以将一些较长的命令进行简化。

  • 使用该指令时 , 用户必须使用单引号' '将原来的命令引起来 , 防止特殊字符导致错误。

  • 该指令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名 , 则可将相应的alias命令存放到bash的初始化文件~/.bash_profile~/.bashrc 中。之后直接使用 sources /path/to/config_file或者 . /path/to/config_file使得配置在文件中的别名生效。

注意‘=’和字符串之间不能包含空格

如果别名同原命令同名 , 需要执行原命令 , 可以使用:

\ALIASNAME
"ALIASNAME"
'ALIASNAME'
command ALIASNAME
/path/command #只适用于外部命令

示例 :

[root@localhost ~]# alias p=ls
[root@localhost ~]# p
anaconda-ks.cfg  generated.iso  ks.cfg  test
​
#alias ifconfig="ifconfig ens33"
#如果此时还是想用ifconfig原始的命令 , 可以直接'ifconfig' 或者\ifconfig这样的方式  , 使命令在不使用别名的时候生效。 
​
#在家目录中 .bashrc 文件是用来专门添加别名的  
​

如果需要开机时alias生效 , 需要将别名的配置在文件/etc/bashrc, /home/ [username] /.bashrc(一般用户username)中。rc表示run command

  • unalias :这个命令可以取消别名

    • -a :取消所有别名设置

命令执行优先级 : 别名>内部命令>hash表中执行命令>外部硬盘中的命令

3. 命令格式

  • 命令常用格式 : COMMAND [OPTIONS...] [ARGUMENTS...]

  • 选项 : 用于启用或关闭命令的某个或某些功能

    • 短选项 : -C 例如-l,-d

      注意 : 有些命令的选项没有-, 如果同一命令同时使用多个短选项 , 多数可合并 : -l -d == -ld

    • 长选项 : --word , 例如--help,--human-readable

      注意: 长选项不能合并有些选项可以带参数 , 此称为选项参数;

    • BSD风格选项 : 一个字母 , 例如 : a , 使用相对较少

  • 参数 : 命令的作用对象 , 比如:文件名 , 用户名

  • 注意:

    • 多个选项以及多参数和命令之间使用空白字符分隔

    • 取消和结束命令执行 : Ctrl+c , Ctrl+d

    • 多个命令可以用;符号分开

    • 一个命令可以用\分成多行


参考链接

博客园:苦逼运维:linux命令之whereis


熊熊