Linux 命令的执行过程/Shell提示符/alias命令

     在 Linux 系统中“一切皆文件”,Linux 命令也不例外。那么,当编辑完成 Linux 命令并回车后,系统底层是怎么执行的?

      

1) 内核层

    内核层是 UNIX/Linux 系统的核心和基础,它直接附着在硬件平台之上,控制和管理系统内各种资源(硬件资源和软件资源),有效地组织进程的运行,从而扩展硬件的功能,提高资源的利用效率,为用户提供方便、高效、安全、可靠的应用环境。

2) Shell层

    Shell 层是与用户直接交互的界面。用户可以在提示符下输入命令行,由 Shell 解释执行并输出相应结果或者有关信息,所以我们也把 Shell 称作命令解释器,利用系统提供的丰富命令可以快捷而简便地完成许多工作。

3) 应用层

    应用层提供基于 X Window 协议的图形环境。X Window 协议定义了一个系统所必须具备的功能(就如同 TCP/IP 是一个协议,定义软件所应具备的功能),可系统能满足此协议及符合 X 协会其他的规范,便可称为 X Window。

一、Linux 命令的执行过程

       Linux 命令的执行过程可分为 3 个步骤。

1、 用户输入命令

     1) 判断路径

扫描二维码关注公众号,回复: 8565774 查看本文章

         判断用户是否以绝对路径或相对路径的方式输入命令(如 /bin/ls),如果是的话直接执行。

[root@centos7 ~]# ls /root
abc  anaconda-ks.cfg  test2
[root@centos7 ~]# /bin/ls /root
abc  anaconda-ks.cfg  test2

     2) 检查别名

         Linux 系统会检查用户输入的命令是否为“别名命令”。

        alias 命令:通过 alias 命令是可以给现有命令自定义别名的,即用一个自定义的命令名称来替换原本的命令名称。也可查看命令的别名。

[root@centos7 ~]# alias ls
alias ls='ls --color=auto'
[root@centos7 ~]# alias rm
alias rm='rm -i'

2、Linux命令行解释器

     Linux命令行解释器(又称为 Shell)会判断用户输入的命令是内部命令还是外部命令。Shell 会把命令解析成二进制格式,二进制命令进入系统内核,在内核中调用相关功能。其中,内部命令指的是解释器内部的命令,会被直接执行;而用户通常输入的命令都是外部命令,这些命令交给步骤3继续处理。

    type 命令:可以判断一个命令属于内部命令还是外部命令

[root@centos7 ~]# type pwd
pwd is a shell builtin  <-- pwd是内部命令
[root@centos7 ~]# type ls
ls is aliased to `ls --color=auto'
[root@centos7 ~]# type /bin/ls
/bin/ls is /bin/ls      <-- ls是外部命令
[root@localhost ~]# type top
top is /usr/bin/top     <-- top是外部命令

3、查找外部命令对应的可执行文件

     当用户执行的是外部命令时,系统会在指定的多个路径中查找该命令的可执行文件,而定义这些路径的变量,就称为 PATH 环境变量,其作用就是告诉 Shell 待执行命令的可执行文件可能存放的位置。

     也就是说,Shell 会在 PATH 变量包含的多个路径中逐个查找,直到找到为止(如果找不到,Shell 会提供用户“找不到此命令”)。

 

内部命令和外部命令的区别:

      内部命令:内部命令由 Shell 自带,会随着系统启动就会被调入内存,常住在内存中,可以直接从内存中读取,所以执行效率很高

      外部命令:外部命令仅是在系统中有对应的可执行文件,执行时需要读取该文件。所以在用户需要运行这些软件的时候,才现从硬盘上把程序文件调入内存中,执行。

 

whereis命令:可查找可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。whereis 程序还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力。

which 命令:在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

[root@centos7 ~]# whereis ls    
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
[root@centos7 ~]# which ls  
alias ls='ls --color=auto'
        /usr/bin/ls
[root@centos7 ~]# whereis pwd
pwd: /usr/bin/pwd /usr/share/man/man1/pwd.1.gz

二、Linux系统终端提示符

     Linux系统终端提示符的特征由系统环境变量 PS1(Prompt String One)定义。     

1、Shell提示符

[用户名@主机名 当前所在目录]#/$

    ~  表示当前用户的家目录

    #  表示是root用户登录,管理员账号登陆

    $  表示普通用户登录

    Shell提示符中用到的基本转义字符

序列 显示值
\a 以ASCII格式编码的铃声,当遇到这个转移序列时,计算机会发出嗡嗡的响声
\d 以日,月,天格式来表示当前日期。例如,"Mon May 26"
\h 本地机的主机名,但不带末尾的域名
\H 完整的主机名
\j 运行在当前shell会话中的工作数
\l 当前终端设备名
\n 一个换行符
\r 一个回车符
\s shell程序名
\t 以24小时制,hours:minutes:seconds的格式表示当前时间
\T 以12小时制表示当前时间
\@ 以12小时制,AM/PM格式来表示当前时间,例如"10:51 PM"
\A 以24小时制,hours:minutes 格式表示当前时间
\u 当前用户名
\v shell 程序的版本号,例如4.3
\V shell 程序的详细版本号,例如4.3.11
\w 当前工作目录名
\W 当前工作目录名的最后部分
\! 当前命令的历史号
\# 当前 shell 会话中的命令数
\$ 这会显示一个"$"字符,除非你拥有超级用户权限。在那种情况下, 它会显示一个"#"字符
\[ 标志着一系列一个或多个非打印字符的开始。这被用来嵌入非打印的控制字符,这些字符以某种方式来操作终端仿真器,比方说移动光标或者是更改文本颜色
\] 标志着非打印字符序列结束

2、通过改变变量PS1的值来改变提示符     

     PS1是一个bash的内建变量

通过命令 echo $PS1来查看当前设置

[root@centos7 ~]# echo $PS1
[\u@\h \W]\$

通过改变PS1变量来修改提示符的内容,修改了解下,平常用不着修改。

[root@centos7 ~]# PS1='[\u\A@\h \w]\$'  
[root15:49@centos7 ~]#

上面只是临时修改了Shell提示符,当我们打开新的终端窗口时,提示符又恢复到默认的了。

如果希望修改永久生效,我们可以通过更改~/.bashrc文件

 

3、查看shell的类型

1)查看当前发行版可以使用的所有shell类型

      要查看当前系统中所有可登录shell的类型,在/etc/shells配置文件中记录了用户可以登录的shell的具体路径,因此查看这个文件的内容,即可知道当前系统中所支持的所有shell类型。

[root@centos7 ~]# cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

2)查看正在运行shell的类型

     通过$0这个变量来获取当前运行的shell类型。

[root@centos7 ~]# echo $0
-bash
[root@centos7 ~]# echo $SHELL
/bin/bash

3)查看某个用户的Shell类型

     不同的用户使用不同的shell,这个取决于用户的配置,该配置在文件:/etc/passwd查看。root用户是使用bash这个shell。

[root@centos7 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

4、在Linux中,不同的文件类型对应的不同的颜色:

     蓝色:表示目录

     白色:表示普通文件

     灰色:表示其它文件

     绿色:表示可执行文件

     浅蓝色:链接文件

     红色:表示压缩文件

     黄色:表示设备文件,包括block,char,fifo

     红色闪烁:表示软链接的文件有问题

     用"dircolors -p"命令可以看到缺省的颜色设置,包括各种颜色和“粗体”,下划线,闪烁等的定义。

 

三、alias命令设置指令的别名

       用户可利用alias,自定指令的别名。若仅输入alias,则可列出目前所有的别名设置。alias的效力仅及于该次登入的操作。若要每次登入是即自动设好别名,可在.profile或.cshrc中设定指令的别名。

alias[别名]=[指令名称]

参数说明:若不加任何参数,则列出目前所有的别名设置。

注意:

等号(=)前后不能有空格,否则就会出现语法错误了。

如果value中有空格或tab,则value一定要使用引号(单、双引号都行)括起来。

1、如何查看别名 

[root@centos7 ~]# alias 
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@centos7 ~]# alias ll
alias ll='ls -l --color=auto'

2、添加临时别名

[root@centos7 ~]# alias a_ll=ll  
[root@centos7 ~]# alias
alias a_ll='ll'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@centos7 ~]# a_ll /root
总用量 4
drwxr-xr-x  3 root root   53 12月 12 14:37 abc
-rw-------. 1 root root 1440 12月  1 20:34 anaconda-ks.cfg
drwxr-xr-x  2 root root    6 12月 12 11:27 test2

3、删除单个临时别名

[root@centos7 ~]# unalias a_ll

如果想删除所有的别名,直接使用 # unalias -a 命令即可,只不过要谨慎使用,避免你设置的所有的别名一下子都被清除了,自己还得一个一个重新设置回来。

alias的效力仅及于该次登入的操作,生成一个临时的别名,重启计算机,就失效了

reboot   命令用于用来重新启动计算机。

4、如何执行命令本身而非别名

     别名虽好,但也有它的弊端,比如定义的别名恰好和某个命令重名了,这就麻烦了,Shell 中执行的将永远都是别名。

如果我们想执行真正的那个命令而非别名,可使用:

    1)使用命令的绝对路径。

    2)在命令前使用反斜线(\)

[root@centos7 ~]# which ls
alias ls='ls --color=auto'
        /usr/bin/ls
[root@centos7 ~]# /usr/bin/ls /root
abc  anaconda-ks.cfg  test2
[root@centos7 ~]# \ls /root
abc  anaconda-ks.cfg  test2

5、如何让别名永久有效

      Linux一切皆是文件,别名永久有效的配置一定是保存在某个文件中,所以,如果想让别名永久有效的话,就需要把所有的别名设置方案保存到($HOME)目录下的 .alias 文件中(如果系统中没有这个文件,你可以创建一个)然后在 .bashrc 文件中增加这样一段代码:

# Aliases
if [ -f ~/.alias ]; then
  . ~/.alias
fi

   在 .alias文件中添加一个编辑ens33文件的别名:alias viens33='vi /etc/sysconfig/network-scripts/ifcfg-ens33'

[root@centos7 ~]# touch .alias
[root@centos7 ~]# ll -a
总用量 32
dr-xr-x---.  4 root root  189 12月 19 16:04 .
dr-xr-xr-x. 17 root root  224 12月  1 20:33 ..
drwxr-xr-x   3 root root   53 12月 12 14:37 abc
-rw-r--r--   1 root root    0 12月 19 16:04 .alias
-rw-------.  1 root root 1440 12月  1 20:34 anaconda-ks.cfg
-rw-------.  1 root root 4046 12月 19 15:53 .bash_history
-rw-r--r--.  1 root root   18 12月 29 2013 .bash_logout
-rw-r--r--.  1 root root  176 12月 29 2013 .bash_profile
-rw-r--r--.  1 root root  176 12月 29 2013 .bashrc
-rw-r--r--.  1 root root  100 12月 29 2013 .cshrc
-rw-------   1 root root   51 12月 12 15:05 .lesshst
-rw-r--r--.  1 root root  129 12月 29 2013 .tcshrc
drwxr-xr-x   2 root root    6 12月 12 11:27 test2
[root@centos7 ~]# vi /root/.alias

[root@centos7 ~]# vi /root/.bashrc
...
[root@centos7 ~]# source /root/.bashrc

   

注意:

1)修改了bashrc文件后,要用 source  /root/.bashrc  命令重载入这个配置文件,然后别名才会生效!

      参考文章:source命令 :使Shell读入指定的Shell程序文件并依次执行文件中的所有语句

2)这个 .alias 文件配置在目录/root/.bashrc中,所以 .alias 文件中的别名只会对root用户生效,换了个用户,又会失效!

     如果想让别名对所有用户都有效,就把这个 .alias文件放在/etc下的,然后在对应的全局别名配置文件( vi /etc/bashrc),配置内容和上面一致!

    

这样设置后,无论怎样重启系统,都不会影响设置的别名啦。

 

    站在前辈的肩膀上,每天进步一点点

ends~

发布了248 篇原创文章 · 获赞 59 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42402854/article/details/103526880