一、linux命令解释器
linux中命令的执行依赖于shell解释器,shell是用户与操作系统之间的接口,它解释用户输入的命令并将其送入内核。常见的shell有bash(linux系统默认shell),csh,ksh等。shell也是一种特殊的程序,例如bash,其二进制程序文件为/bin/bash
1、查看当前使用的shell类型:echo $SHELL
2、改变用户登录时使用的shell,可使用chsh命令:
用法:chsh [选项] [参数]
常用选项:
-s:指定用户登录的shell(需为完整路径名,如/bin/csh)
-l:列出当前系统可用的shell
例如:chsh -s /bin/csh
二、linux命令类型
根据linux命令与shell的关系,可将命令分为两类:
1、内置命令:是shell内置的一些特殊指令,没有单独的对应的系统文件,随着解释器被自动载入内存,直接供用户使用
2、外部命令:本身是一个独立的可执行文件,命令名即为程序文件名
要查看命令的类型,可使用type命令:(内置命令会显示为builtin,外部命令会显示其绝对路径)
用法:type [option]... command
常用选项:
-a:显示该命令所有可能的信息,包括alias
-p:后面接的命令与外部命令时,才会显示完整路径
-t:输出“file”、“alias”或者“builtin”,分别表示给定的命令为“外部指令”、“命令别名”或者“内部指令”
[root@localhost ~]# type cd cd is a shell builtin [root@localhost ~]# type -a ls ls is aliased to `ls --color=auto' ls is /bin/ls
三、bash变量
变量实质上是有名称的内存空间
1、bash变量的类别:
1)本地变量:只对当前shell进程有效,对其它shell进程(包括当前shell进程的子进程)无效
2)环境变量:对当前shell及其子进程有效,对其它shell进程无效,通常是shell内置的一些变量(如PATH,HISTSIZE,LANG,RANDOM,SHELL等)及通过export命令导出的变量,要查看当前shell进程的所有环境变量,可直接使用export,env,printenv命令
3)局部变量:对shell脚本中某代码片断有效,通常用于函数本地,local VAR_NAME=VALUE
4)只读变量:readonly var_name
5)位置变量:如$1(第一个参数),$2...
6)特殊变量:
$?:上条命令的状态返回值,主要用于判断程序或脚本是否执行成功,0表示成功,1-255表示失败
$#:参数的个数
$*:参数列表
$0:命令或脚本本身
$$:脚本所有进程ID
$@ 和 $* 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数
2、变量类型:
分为字符型(默认)和数值型,变量类型决定了变量的存储机制、存储空间、参与的运算方式
3、除了shell内置的环境变量,我们也可自定义变量,直接用ValriablName=VALUE(注意:与其它编程语言不同,shell中变量赋值时,等号两边不能有空格)的方式即可,如pretty=beauty
4、查看所有变量(包括环境变量和自定义变量):set
另外,set命令可设置bash的某些特性:
set -C:指定不覆盖已存在的文件 set +C:指定可覆盖已存在的文件
5、要获取某个变量的值,可使用echo $变量名,如echo $PATH
6、取消变量的值:unset 变量名,如unset pretty
7、变量设定的几个重要规则:
1)变量名只能是英文和数字和下划线,且不能使用程序中的关键字,不能以数字开头,如2mouse=bro 错误。应尽量做到见名知义
2)变量名中若包含空格,需要使用引号(或转义字符/),但单双引号的功能是有区别的:
双引号:弱引用,双引号内若包含变量,会被替换,如echo "I love my $HOME"会显示为I love my /home/tesla
单引号:强引用,引号中的内容会直接显示,echo "I love my $HOME"会显示为I love my $HOME
3)使用转义字符\将特殊字符(如空格、ENTER、$、'等)变成一般字符
如name=bluce\ lee echo $name结果为bluce lee
4)扩增变量内容
变量名="$变量名"新增内容,例如PATH="$PATH":/usr/loca/mysql/bin
5)使用export命令将自定义变量(包括被修改的原环境变量)转为环境变量
export 变量名,如export LANG=en(表示使用英文编码,通常用于临时解决乱码问题)
8、PATH环境变量
当我们执行外部命令时,系统是透过shell内置的PATH环境变量所定义的路径中从左往右依次寻找的,这就是为何我们很多时候只需输入命令名而非其绝对路径的原因,而且我们可以自由地将某个命令的路径添加进PATH变量中,由此给工作带来了很大便利
更改PATH环境变量的方法:
1)直接使用export命令,如export PATH="$PATH:/usr/loca/mysql/bin",该设置会在终端断开后失效,若要持久有效,需修改/etc/profile
2)编辑/etc/profile文件或/etc/profile.d/*.sh,在文档最后添加export PATH="$PATH:新增内容",保存退出,然后重新读取该文件(. file或source file),该设置对全局有效
9、设置命令提示符
bash命令提示符即命令行窗口起头的那一段,如[root@localhost ~]#,是透过shell内置的变量PS1显示的。PS1可用到的一些符号意义说明:
\u:当前用户的名称
\d:可显示出“星期 月 日”的日期格式
\H:完整的主机名称,如web.diaozt.com
\h:仅取主机名称的第一小段,如web
\t:显示精确到秒的24小时格式的时间,如15:20:10
\T:显示精确到秒 的12小时格式的时间,如09:20:10
\@:显示时间,为12小时格式的AM/PM样式,如06:22 AM
\w:完整的工作目录名,家目录为以~取代,如 /home/tesla/test
\W:路径的基名,即以basename命令取得的名称,如test
\$:提示字符,root用户初始时为#,其它为$
[root@localhost test]# echo $PS1 [\u@\h \W]\$ [root@localhost test]# export PS1="[\u@\H \@ \w]\$ " [[email protected] 06:45 AM /home/tesla/test]$
10、通过键盘读取变量的值
使用read命令可从键盘读取变量的值,可同时读取多个变量的值,输入时以空格隔开,该命令常用于bash脚本中
用法:read [option]... variable...
选项:
-p:指定读取值时的提示符
-t:指定读取值时的等待时间
例 read -p "Please input two words:" -t 5 a1 a2
四、命令历史
history命令用来显示命令历史
用法:
直接使用该命令显示所有历史命令
history N:显示最近N条命令(包括当前history命令自身)
history -d 命令编号 :删除指定命令条目
history -a [/path/to/some_history_file]:将当前会话的命令历史写入指定文件
与命令历史相关的几个环境变量:
history -c:清空命令历史
HISTFILE:用户退出时命令历史的持久保存位置,默认为~/.bash_history
HISTFILESIZE:命令历史文件所能记录的最大条目数
HISTSIZE:history所能显示的命令历史的最大条目数
在我们登出bash时,我们下达过的命令的历史默认为会被保存至用户家目录的~/.bash_history文件中,每次登录bash时,系统会自动读取该文件,这就是为何使用history命令还能看到以前bash进程中命令历史的原因。那么~/.bash_history会记录多少条历史条目呢?这个数据保存于环境变量HISTFILESIZE中,默认为1000。当命令历史条目超过该数值时,旧的记录会被冲掉。区别于HISTFILESIZE,HISTSIZE变量保存的是history的条目数
使用命令历史可简化命令的操作:
!N:执行命令历史中的第N条命令
!!:执行上一个命令
!string:执行命令历史中最近一次以string开头的命令
!$(加在命令command后):调用上一个命令的最后一个参数
command后按ESC松开然后按【.】:功能同!$
[root@localhost tesla]# ls /home/tesla inittab iron test [root@localhost tesla]# ls !$ ls /home/tesla inittab iron test [root@localhost tesla]# !! ls /home/tesla inittab iron test [root@localhost tesla]# date Tue Aug 11 13:05:30 CST 2015 [root@localhost tesla]# !d date Tue Aug 11 13:05:34 CST 2015 [root@localhost tesla]#
五、命令别名
有时要输入一长串的命令比较麻烦,可使用alias命令指定其为一个较短的别名
用法:
不带任何参数则直接显示所有已定义的别名
指定别名:alias name(别名)=value(原命令),如alias rm='rm -i',alias ls='ls --color=auto'
若别名与原命令相同,而想执行原命令,可使用绝对路径或\command
撤消指定别名:unalias name
撤消所有别名:unalias -a
注意:命令行中定义的别名,其生效范围为当前会话,若要定义的别名持久有效,可将其写入/etc/bashrc(或~./bashrc)文件。例如echo "alias dt=date" >> /etc/bashrc
[root@localhost tesla]# alias alias cp='cp -i' 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@localhost tesla]# date Tue Aug 11 13:00:47 CST 2015 [root@localhost tesla]# alias dt=date [root@localhost tesla]# dt Tue Aug 11 13:01:04 CST 2015 [root@localhost tesla]# unalias dt [root@localhost tesla]# dt -bash: dt: command not found [root@localhost tesla]
六、如何获取命令帮助?
内部命令:command help
外部命令:
1、command --help
2、手册manual(简写为man):man [章节] COMMAND,例如man ifconfig
①手册有章节之分(1-9),一个命令可能存在于多个章节中,可使用whatis COMMAND查看一个命令执行什么功能及其手册存在于哪些章节中。whatis命令相当于man -f
②帮助中的格式字串:[ ]表示可省略 < >表示不可省略 |表示二选一或多选一 ……表示同类内容可以出现多个
③在man中翻屏:
空格键:向文件尾部翻一屏,b:向文件首部翻一屏,回车键:向文件尾部翻一行,k:向文件首部翻一行,ctrl+d:向文件尾部翻半屏,ctrl+u:向文件首部翻半屏
④在man中也可搜索字串,方法同vim中字串搜索
⑤man能够为除命令之外的配置文件、系统调用、库调用等提供帮助手册,它们分别位于不同的章节中 1:用户命令 2:系统调用 3:库调用 4:设备文件 5:配置文件 6:游戏 7:杂项 8:管理命令
3、info命令:获取在线文档,仅在man手册无法获取到足够信息,或想了解程序的开发历史时才使用
七、命令的搜索顺序
1、以绝对/相对路径执行命令
2、由alias找到该命令来执行
3、作为bash内置命令来执行
4、通过PATH环境变量搜索到的第一个命令执行
例如,ls的别名与其自身名称相同,由于alias优先于搜索PATH,所以我们使用ls实际是执行其别名命令,即ls --color=auto,若要执行原命令,则使用绝对路径/bin/ls
八、bash快捷键:
ctrl+a:跳至行首(或home键) ctrl+e:跳至行尾(或end键)
ctrl+u:删除命令行首至当前光标处的所有内容
ctrl+k:删除当前光标处至命令行尾的所有内容
ctrl+l:清屏(或clear)
ctrl+c:中止或取消
ctrl+z:将当前命令送至后台执行
九、bash重要特性之命令(或路径)补全
如果用户指定的开头字符串能惟一标识某命令(或路径),则按tab键能补全该命令,否则,再次tab键可显示所有以指定字符开头的命令
十、shell特殊符
单引号' '(硬引用)、双引号" "(软引用)和转义符【\】,这三种字符前面已作说明,此处不再赘述
十一、shell登录类型
交互式(login shell):
1)直接通过终端输入帐号和密码登录的
2)使用su -l username 或 su - username登录的
非交互式(non-login shell):
1)su username
2)图形界面下打开的终端
3)执行脚本
十二、bash配置文件
分为两类:
profile类:为交互式登录的用户提供配置
全局:/etc/profile,/etc/profile.d/*.sh
用户:~/.bash_profile
功用:1、设定环境变量 2、运行命令或脚本
bashrc类:为非交互式的用户提供配置
全局:/etc/bashrc
用户:~/.bashrc
功用:1、设定本地变量 2、定义命令别名
/etc/profile文件说明:
每个交互式登录用户在取得bash时都会读取该文件,该配置文件根据用户的UID来设定很多变量的值,如PATH,MAIL,MAIL,HOSTNAME,USER以及umask值
通过编辑配置文件修改的配置如何生效?
1、退出并重新登录 2、让bash重读此配置文件( . file或source file)
bash配置文件的读取顺序:
①交互式登录用户: /etc/profile→/etc/profile.d/*.sh→~/.bash_profile→~/.bashrc→/etc/bashrc
交互式登录用户读取的配置文件其实只有/etc/profile,但此文件会呼叫其它配置文件
②非交互式登录用户:~/.bashrc→/etc/bashrc→/etc/profile.d/*.sh
十三、几个重要命令
1、exec:用于调用并执行指定的命令。
我们知道,在bash shell进程中执行命令即开启了一个子进程,该子进程终止后又回到父进程;而exec会启动command为一个进程,此进程会取代当前shell进程,指定的命令结束后会立即退出终端
用法:exec COMMAND
[root@node2 ~]# su - tesla [tesla@node2 ~]$ exec mail #查看邮箱后自动退出当前shell进程 No mail for tesla [root@node2 ~]# exec echo "See you later" See you later Connection closed by foreign host. Disconnected from remote host(192.168.30.20:22) at 20:13:27. Type `help' to learn how to use Xshell prompt. [c:\~]$
2、screen
想象一种场景,当我们远程登录linux,运行一些程序(如下载),如果这些程序需要运行很长时间,而程序运行过程中出现网络故障导致连接中断,则远程服务器上没有正常结束的命令将被迫中止。而scree工具就能很好地避免这种问题
screen:用户可以通过该工具同时连接多个本地或远程的的命令行会话,并在其间自由切换
在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存,用户可以通过快捷键在不同的窗口下切换。只要Screen本身没有终止,在其内部运行的会话都可以恢复
用法:
screen:启动新屏幕,默认是attached模式,即建好之后就连上去
screen -S NAME:启动一个带名称的新屏幕
screen -dm [NAME]:以detached模式启动一个新屏幕,也即建好之后不会连上去
screen -ls:查看所有被隐藏的屏幕ID
exit:退出新屏幕(关闭)
Ctrl+a,d(detach):拆除新屏幕(临时隐藏)
screen -r SID:恢复某隐藏的屏幕;若屏幕只有一个,SID可省略
screen -d -r SID:拆除当前屏幕并恢复到指定屏幕
Ctrl+a,n(next):下一个屏幕
Ctrl+a,p(previous):上一个屏幕