在 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) 判断路径
判断用户是否以绝对路径或相对路径的方式输入命令(如 /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~