- 前言
- 1.Shell介绍
- 2.SHELL的常用特殊符号(通配符)
- 3.命令或文件自动补全(tab)
- 4.别名(alias)
- 5.命令执行过程
- 6.环境变量及作用
- 7.自定义变量
- 8. PATH环境变量及作用
- 总结
前言 本小节的内容是讲解Linux的命令行如何执行,包含命令解释器、shell配置、别名、环境变量等基础知识。
1.Shell介绍
shell是内核与用户打交道的中间桥梁,其实就是解释命令的解释器。例如用户在终端输入一个命令,shell就向内核解释这个命令要实现的功能。
查询当前的shell(使用哪个工具作为当前系统默认命令解释器)
[root@zaishu ~]# echo $SHELL(使用哪个工具作为当前系统默认命令解释器) /bin/bash //当前的命令解释器是bash。
更改shell
终端输入想要运行的shell名称即可。 [root@zaishu ~]# ksh //当前系统不支持ksh -bash: ksh: command not found [root@zaishu ~]# sh (使用SH作为输入命令行的解释器) sh-4.2#
shell命令的语法
command -options [argument] command:命令的名称。 -options:选项,同一个命令可能有很多不同的选项,用来完成不同的具体功能。 [argument]:参数可选
sh-4.2# exit exit [root@zaishu ~]# ls (不带参数) anaconda-ks.cfg ip.sh lamp-master lamp-master.zip sdcms_php_ee_2.4.2.zip web [root@zaishu ~]# ls -a (带参数) . anaconda-ks.cfg .bash_logout .bashrc ip.sh lamp-master.zip .pki .tcshrc .. .bash_history .bash_profile .cshrc lamp-master .mysql_history sdcms_php_ee_2.4.2.zip web2.SHELL的常用特殊符号(通配符)
(1)“*”
可以表示任意一个字符(包括空字符)或多个字符组成的字符串。例如
//查看当前目录下的所有以a开头的文件及文件夹的信息 [root@zaishu ~]# ls a* aa aaa aabbc anaconda-ks.cfg
(2)“?”
表示单个字符。
[root@zaishu ~]# ls a? aa //查看当前目录下的所有以a开头的长度为2的文件及文件夹的信息
(3)“[ ]”
指定范围
例如,在当前目录下新建5个文件,名为a、b、c、d、e。 [root@zaishu ~]# touch a [root@zaishu ~]# touch b [root@zaishu ~]# touch c [root@zaishu ~]# touch d [root@zaishu ~]# touch e [root@zaishu ~]# ls [a-d] a b c d //仅查看名为a~d的文件
(4)“!”
排除符号,需要与“ [ ]”符号联合使用。
[root@zaishu ~]# ls [!a-d] //文件名为单个字符,并且排除a-d的文件 1 e
(5)“;”
分割符号,用于在一行输入多个命令时,分隔各个命令。
//先创建文件zs,然后查看当前目录下文件信息 [root@zaishu ~]# touch zs ; ls 1 a aa aaa aabbc anaconda-ks.cfg b c d e ip.sh lamp-master lamp-master.zip sdcms_php_ee_2.4.2.zip web zs
(6)“`”
命令替代符,包含的字符串是会被执行的命令。
[root@zaishu ~]# echo `ls ` //将命令ls的结果显示出来 1 a aa aaa aabbc anaconda-ks.cfg b c d e ip.sh lamp-master lamp-master.zip sdcms_php_ee_2.4.2.zip web zs [root@zaishu ~]# echo 'ls' //这里ls只是普通字符串 ls
(7)“#”
注释符号,#开头的行是注释,不会被执行。
[root@zaishu ~]# # touch ceshi //带了#这一行不会被执行,经常用在写shell脚本的时候使用,用作注释 [root@zaishu ~]# ls ceshi ls: cannot access ceshi: No such file or directory3.命令或文件自动补全(tab)
linux中Shell提供命令行自动补全的功能,在输入文件名的时候,只要输入文件名前几个字符,然后按Tab键,Shell可以自动将文件名补全。
1、当目录下只有一个以fs开头文件的时候:
[root@zaishu etc]# cd /etc/ [root@zaishu etc]# cat fs <----当前目录下只有一个以fs开头的文件 当按下Tab键时,Shell自动将"fs"补全成了"fatab",这是因为当前/etc目录中只有fstab是以"fs"开头,因此Shell可以确定这里想要输入的文件名称为fstab。
2、如果当前目录中含有多个以指定字符(或字符串)开头的目录或文件,Shell会以列表的形式给出所有以指定字符或字符串开头的文件或目录,供用户选择,执行如下命令:
[root@zaishu ~]# ls a a aa aaa aabbc anaconda-ks.cfg 按下Tab键时,Shell会列表的形式显示给用户当前目录下所有以"a"开头的文件或目录。
Shell提供的命令行补全功能不仅适用于补全文件名,也同样适用于所有Linux命令。
3、当输入ca并连续按下2次Tab键时,Shell会罗列出所有以"ca"开头的Linux命令,如下所示:
[root@zaishu ~]# ca cacertdir_rehash ca-legacy capsh case catchsegv cal caller captoinfo cat catman4.别名(alias)
1.设置别名
alias 别名=’原命令 -选项/参数’
[root@zaishu ~]# alias lt='ls -lt' 这样设置了ls -lt命令的别名是lt,在终端输入lt时,则相当于输入了ls -lt命令 [root@zaishu ~]# lt total 4580 -rw-r--r-- 1 root root 0 Oct 22 11:26 zs -rw-r--r-- 1 root root 0 Oct 22 11:25 1 -rw-r--r-- 1 root root 0 Oct 22 11:22 e -rw-r--r-- 1 root root 0 Oct 22 11:22 d -rw-r--r-- 1 root root 0 Oct 22 11:22 c -rw-r--r-- 1 root root 0 Oct 22 11:21 b -rw-r--r-- 1 root root 0 Oct 22 11:21 a -rw-r--r-- 1 root root 0 Oct 22 11:14 aabbc -rw-r--r-- 1 root root 0 Oct 22 11:14 aaa -rw-r--r-- 1 root root 0 Oct 22 11:14 aa -rwxr-xr-x 1 root root 0 Oct 21 15:31 ip.sh drwxr-xr-x. 2 root root 6 Oct 14 17:52 web drwxr-xr-x. 6 root root 194 Oct 14 17:22 lamp-master -rw-r--r--. 1 root root 4459288 Oct 14 16:47 sdcms_php_ee_2.4.2.zip -rw-r--r--. 1 root root 224957 Oct 14 15:41 lamp-master.zip -rw-------. 1 root root 1368 Oct 8 2020 anaconda-ks.cfg
注意: 定义别名时,等号两边不能有空格,否则shell不能决定您需要做什么。仅在命令中包含空格或特殊字符时才需要引号。
2.查看已经设置的别名列表
如果键入不带任何参数的alias 命令,将显示所有已定义的别名。
[root@zaishu ~]# 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 lt='ls -lt' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
3.删除别名
unalias 别名1 [root@zaishu ~]# unalias lt [root@zaishu ~]# lt -bash: lt: command not found
4.设置别名每次登入可用
alias命令只作用于当次登入的操作。如果想每次登入都能使用这些命令的别名,则可以把相应的alias命令存放在 ~/.bashrc 或者.bash_profile文件中。
打开~/.bashrc文件,输入要设置的alias命令,保存,然后运行
[root@zaishu ~]# vi .bashrc
#.bashrc
#User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias lt='ls -lt'
#Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
让其立即生效
source ~/.bashrc1
这样就可以每次登入后都可以使用设置好的命令别名。
5.命令执行过程简单来说,Linux 命令的执行过程分为如下 4 个步骤。
-
判断路径
判断用户是否以绝对路径或相对路径的方式输入命令(如 /bin/ls),如果是的话直接执行。 -
检查别名
Linux 系统会检查用户输入的命令是否为“别名命令”。要知道,通过 alias 命令是可以给现有命令自定义别名的,即用一个自定义的命令名称来替换原本的命令名称。
例如经常使用的 rm 命令,其实就是 rm -i 这个整体的别名:
[root@localhost ~]# alias rm alias rm='rm -i' 这使得当使用 rm 命令删除指定文件时,Linux 系统会要求我们再次确认是否执行删除操作。例如: [root@localhost ~]# rm a.txt <-- 假定当前目录中已经存在 a.txt 文件 rm: remove regular file 'a.txt'? y <-- 手动输入 y,即确定删除 [root@localhost ~]# 这里可以使用 unalias 命令,将 Linux 系统设置的 rm 别名删除掉,执行命令如下: [root@localhost ~]# alias rm alias rm='rm -i' [root@localhost ~]# unalias rm [root@localhost ~]# rm a.txt [root@localhost ~]# <--直接删除,不再询问 注意,这里仅是为了演示 unalisa 的用法。实际工作中不加提示的删除慎用
- 判断是内部命令还是外部命令
Linux命令行解释器会判断用户输入的命令是内部命令还是外部命令。内部命令指的是解释器内部的命令,会被直接执行;而用户通常输入的命令都是外部命令,这些命令通过环境变量当中Path来指定位置。
内部命令由 Shell 自带,会随着系统启动,可以直接从内存中读取;而外部命令仅是在系统中有对应的可执行文件,执行时需要读取该文件。
判断一个命令属于内部命令还是外部命令,可以使用 type 命令实现。例如: [root@localhost ~]# type pwd pwd is a shell builtin <-- pwd是内部命令 [root@localhost ~]# type top top is /usr/bin/top <-- top是外部命令
- 查找外部命令对应的可执行文件
当用户执行外部命令时,系统会在指定多个路径中查找该命令的可执行文件,而定义这些路径的变量,就称为 PATH 环境变量,作用就是告诉 Shell 当中可执行文件存放的位置,也就是说,Shell 会在 PATH 变量包含的多个路径中逐个查找,直到找到为止(如果找不到,Shell 会提供用户“找不到此命令”)。
[root@zaishu ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin6.环境变量及作用
变量是计算机系统用于保存可变值的数据类型,可以直接通过变量名称来提取到对应的变量值。在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。
Linux 系统中环境变量的名称一般都是大写的。可以使用 env 命令来查看到 Linux 系统中所有的环境变量,执行命令如下:
[root@localhost ~]# env ORBIT_SOCKETDIR=/tmp/orbit-root HOSTNAME=livecd.centos GIO_LAUNCHED_DESKTOP_FILE_PID=2065 TERM=xterm SHELL=/bin/bash ......
Linux 系统能够正常运行并且为用户提供服务,需要数百个环境变量来协同工作,这里列举了 10 个非常重要的环境变量,如表 1 所示。
表 1 Linux系统中重要的10个环境变量
Linux 作为一个多用户多任务的操作系统,一个相同的环境变量会因为用户身份的不同而具有不同的值。
使用下述命令来查看 HOME 变量在不同用户身份下都有哪些值:
[root@zaishu ~]# echo $HOME /root [root@zaishu ~]# su - oracle //su 命令用切换用户,具体使用方法可以看后面内容 [oracle@zaishu ~]$ echo $HOME /home/oracle7.自定义变量
环境变量是由固定的变量名与用户或系统设置的变量值两部分组成的,可以自行创建环境变量来满足工作需求。例如,设置名称为 web 的环境变量,执行命令如下:
[root@zaishu ~]# mkdir -p /www/zaishu
[root@zaishu ~]# export web=/www/zaishu
[root@zaishu ~]# echo $web
/www/zaishu
[root@zaishu ~]# cd $web
这样的环境变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用:
[root@zaishu zaishu]# su - oracle [oracle@zaishu ~]$ cd $web [oracle@zaishu ~]$ pwd /home/oracle [oracle@zaishu ~]$ echo $web8. PATH环境变量及作用
在讲解 PATH 环境变量之前,首先介绍一下 which 命令,它用于查找某个命令所在的绝对路径。例如:
[oracle@zaishu ~]$ which rm /bin/rm [oracle@zaishu ~]$ which rmdir /bin/rmdir [oracle@zaishu ~]$ which ls//它使用 alias 命令做了别名, ls 实际上执行的是 ls --color=auto alias ls='ls --color=auto' /bin/ls
通过使用 which 命令,可以查找命令所在的绝对路径。之前使用 rm、rmdir、ls 等命令时,无论当前位于哪个目录,都可以直接使用,无需指明命令的执行文件所在的位置。因为可以通过PATH 环境变量对应的目录找到命令。
首先,执行如下命令:
[root@zaishu zaishu]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
这里的 echo 命令用来输出 PATH 环境变量的值,PATH 环境变量的内容是由目录组成的,目录之间用冒号“:”隔开。当执行某个命令时,Linux 会依照 PATH 中包含的目录依次搜寻该命令的可执行文件,一旦找到,即正常执行;反之,则提示无法找到该命令。
如果在 PATH 包含的目录中,有多个目录都包含某命令的可执行文件,则会执行先搜索到的可执行文件。
/bin 目录已经包含在 PATH 环境变量中,因此在使用类似 rm、rmdir、ls等命令时,Linux 可以找到该命令。
下面举个反例,将ls命令移动到 /root 目录下,由于 PATH 环境变量中没有包含此目录,所有当直接使用 ls 命令名执行时,Linux 将无法找到此命令的可执行文件,并提示 No such file or directory:
[root@zaishu zaishu]# mv /bin/ls ~/ [root@zaishu zaishu]# ls -bash: /usr/bin/ls: No such file or directory
此时仍想使用 ls 命令,有 2 种方法,一种是直接将 /root 添加到 PATH 环境变量中,例如:
[root@zaishu zaishu]# PATH=$PATH:/root [root@zaishu zaishu]# ls [root@zaishu zaishu]#
另一种方法是以绝对路径的方式使用此命令,例如:
[root@zaishu zaishu]# /root/ls [root@zaishu zaishu]#总结 本章讲解的内容简单但也很重要



