一、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:新增内容",保存退出,然后重新读取该文件(. filesource 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):上一个屏幕