目录

1.用户登录不同终端

2.shell介绍

    (1)查看shell

    (2)bash shell:命令提示符、可执行命令

    (3)命令格式

    (4)bash快捷键

3.基本命令使用

    (1)date

    (2)screen

    (3)echo

    (4)Tab

    (5)history

    (6)ls

4.帮助命令

    (1)whatis

    (2)help

    (3)man

5.文件管理

    (1)文件系统结构

    (2)文件时间戳

    (3)通配符

    (4)文件的复制cp

    (5)文件的移动mv

    (6)inode表和软硬链接

6.重定向和管道

    (1)重定向

    (2)管道

7.总结

 正文

1.用户登录不同终端

    在Linux系统中,用户分为root用户和普通用户。root用户又称为超级用户,是一个管理账户,对系统几乎可以完整控制,而普通用户的权力有限。在个人虚拟机登录时,一般使用root账户,但在企业中root账户不要轻易登录。

    Linux终端分类:   

    设备终端键盘鼠标显示器

    物理终端( /dev/console )

    虚拟终端(tty:teletypewriters, /dev/tty#  #为[1-6])

    图形终端( /dev/tty7 ) startx, xwindows

    串行终端( /dev/ttyS# )

    伪终端( pty:pseudo-tty , /dev/pts/# )

    打开虚拟机,在图形登录界面登录,这是一个图形终端。命令tty可以查看当前所在终端,crt+alt+F[2-6],可以打开其它虚拟终端,crt+alt+F1切换到图形终端。在图形界面登录后,打开“终端”,这是一个伪终端。

    crt+alt+F3,打开tt3虚拟终端,tty命令查看当前终端。

    

    


    在图形界面登录后,打开“终端”,用命令tty查看,这是伪终端。

    

2.shell介绍

(1)查看shell

  •     shell是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。

  •     shell也被称为LINUX的命令解释器(command interpreter)。

  •     shell是一种高级程序设计语言。

    

    [root@centos6 ~]#echo $SHELL    //查看当前shell类型

    /bin/bash

    [root@centos6 ~]#cat /etc/shells    //查看当前系统安装的shell

    /bin/sh

    /bin/bash

    /sbin/nologin

    /bin/dash

    /bin/tcsh

    /bin/csh

(2)bash shell:命令提示符、可执行命令

  • 命令提示符

    Linux中使用的一般是bash shell,在输入命令的时候,前面会有命令提示符,可以对这些提示符进行修改。用命令修改,重启虚拟机后,命令提示符还会回复原样,要永久修改,需要将修改命令加入到/etc/bashrc或/root/.bashrc文件中。

    

    [root@centos6 ~]#su - tom     //#表示当前用户是超级用户

    [tom@centos6 ~]$su -    //$表示普通用户

    Password: 

    

    [root@centos6 ~]# echo $PS1    //显示当前命令提示符格式

    [\u@\h \W]\$

    [root@centos6 ~]# PS1="\[\e[31m\][\u@\h \W]\\$\[\e[0m\] "    //修改命令提示符格式,修改31可改变颜色,\e为\033,\u当前用户,\h主机名简称,\H主机名,\W当前目录,\w详细目录,\t 24小时格式,\T 12小时格式

    [root@centos6 ~]# PS1="\[\e[31m\][\u@\H \W]\\$\[\e[0m\] "

    [[email protected] ~]# PS1="\[\e[31m\][\u@\H \w]\\$\[\e[0m\] "

    [[email protected] ~]# cd /etc

    [[email protected] /etc]# 

  • 可执行命令

    Linux中的可执行命令分为内部命令和外部命令。内部命令:由shell自带的,help 内部命令  查看内部命令的帮助信息,在文件系统上也会有该命令的外部路径。外部命令:在文件系统路径下有对应的可执行程序文件。type可以查看命令类型,enable可以禁用激活内部命令。

    type   command 显示命令类型

    [root@centos6 ~]# type cd

    cd is a shell builtin    //内部命令

    [root@centos6 ~]# type ls

    ls is aliased to `ls --color=auto'    //别名

    [root@centos6 ~]# type ifconfig

    ifconfig is /sbin/ifconfig    //外部命令

    enable    command

    [root@centos6 ~]# enable -n cd    //禁用内部命令cd

    [root@centos6 ~]# type cd

    -bash: type: cd: not found

    [root@centos6 ~]# enable  cd    //重新激活cd

    [root@centos6 ~]# type cd

    cd is a shell builtin

    hash缓存表
    Linux中,外部命令执行过一次后,会将命令的路径存放到hash缓存表中,下次在执行这条外部命令时,先到hash表中查询,如果没有,在到外部路径中查询。        [root@centos6 ~]# hash    //显示所有被hash的命令路径

    hash: hash table empty

    [root@centos6 ~]# ls -d

    .

    [root@centos6 ~]# hash

    hits command

       1 /bin/ls

    [root@centos6 ~]# hash -l    //显示所有被hash的命令路径,包括别名

    builtin hash -p /bin/ls ls

    [root@centos6 ~]# hash -r    //清空hash表

    

    别名alias

    在执行命令时,命令过长或需要加入一些参数,可以用别名进行操作,方便效率。如果别名和原命令一样,要使用原命令可以加上\,""或''。

       

    [root@centos6 ~]# alias    //显示所有别名

    alias cp='cp -i'

    alias l.='ls -d .* --color=auto'

    alias ll='ls -l --color=auto'

    [root@centos6 ~]# alias sf='cd /etc/sysconfig'    //起别名

    [root@centos6 ~]# sf

    [root@centos6 sysconfig]# cd 

    [root@centos6 ~]# unalias sf        //取消别名

    [root@centos6 ~]# sf

    -bash: sf: command not found

    [root@centos6 ~]# unalias -a    //取消所有别名

    

    执行一条命令的查找顺序

    别名->内部命令->外部命令->hash缓存表->PATH路径


(3)命令格式

    COMMAND [OPTIONS...] [ARGUMENTS...] 选项:用于启用或关闭命令的某个或某些功能短选项:-c  例如:-l, -h

    长选项:--word 例如:--all, --human-readable 参数:命令的作用对象,比如文件名,用户名等

    ; 命令连接符,前一条命令执行结束,再执行下一条命令

     \ 命令换行符

 

(4)bash快捷键  

  •     Ctrl+L 清屏

  •     Ctrl+O 执行当前命令,并重新显示本命令

  •     Ctrl+s 锁定,但仍可以运行命令。

  •     Ctrl+q 解锁

  •     Ctrl+C 强制结束

  •     Ctrl+D 正常终止

  •     Ctrl+Z 挂起(暂停)命令

  •     Ctrl + a 光标移到命令行首,相当于Home

  •     Ctrl + e 光标移到命令行尾,相当于End 

  •     Ctrl + u 删除光标之前的内容

  •     Ctrl + k 删除光标这后的内容

  •     Crtl + r 删除全部内容

   

3.基本命令使用

(1)date

  •         +%Y 年

  • +%m 月

  • +%d 日

  • +%H 时

  • +%M 分

  • +%S 秒

  • +%w 星期

  • +%F 年-月-日

  • +%T 时:分:秒

     设置时间

     date 月日时分年[.秒]

     date -s '年-月-日 时:分:秒'

    

    [root@centos6 ~]# 

    [root@centos6 ~]# date +%F

    2018-01-12

    [root@centos6 ~]# date "+%Y年%m月%d日  %H时%M分%S秒  星期%w"   //按格式显示日期

    2018年01月12日  17时08分27秒  星期5


    编写一个脚本,按照自己定义格式显示日期

    


    

(2)screen

    screen创建一个会话,加入这个会话后,在一个终端输入命令,另一个终端也会同时显示。

    

  •     screen 生成默认命令方式的screen即终端名.主机名前缀

  •     screen -S 会话名 创建指定名的screen

  •     screen -x 会话名 加入已创建的screen

  •     screen -ls 查看所有已打开的screen

    

    在下图左侧用screen -S test创建一个会话,在下图右侧输入screen -x test加入这个会话,在左侧输入什么命令,右边也会出现。

    

(3)echo

    echo将字符显示到屏幕上,也可以将变量值显示。

    

  •     -E 不开始解释功能,默认

  •     -n 不自动换行

  •     -e 开启解释功能 "",双引号一定要加

  • \a 警告声

  • \b 退格

  • \c 不换行

  • \n 回车换行

  • \r 回车,即光标移至行首,但不换行

  • \t 插入tab

  • \\ 插入\

        

    echo显示变量的用法

  •     $() 或 ``引用命令执行的结果

  •     $(()) 或$[]进行运算

  •     使用${}或"$变量名" 划定变量名的起止范围

        


(4)Tab

    Tab键根据输入的字符来补全命令或路径,如果根据输入的字符就能确定,将会直接补齐。如果不能确定,再按一次就会将以这些字符开头的结果都显示出来,在输入字符进行进一步确认补齐。

    下图,在1处点2次Tab键,有2个结果供选择,再输入cd /bi,按一次Tab直接补齐。

    

(5)history

    history用来查看以前的历史命令,也可以执行以前的历史命令。历史命令放在~/.bash_history中,登录shell时,会读取命令历史文件中记录下的命令~/.bash_history;登入shell时,产生的历史命令会放在缓存中,这时这些历史记录不会在.bash_history文件中,用户退出后,才会追加到文件中。用户也可以不退出,直接用命令 history -a进行追加。

   

  •     history 查询历史记录

  •     !n  重复执行某条历史

  •     !!  重复执行上一条命令

  •     ctrl+p 等于上箭头

  •     ctrl+n 等于下箭头

  •     ctrl+j 等于回车

  •     !string  重复前一个以“string”开头的命令

  •     ctrl+r 命令历史中搜索命令

    

  •     history -c 清空当前的所有历史记录

  •     history -d 删除某条历史

  •     history -a 将当前终端新执行的命令写入历史记录文件   (文件由变量HISTFILE决定,默认为用户家目录下的.bash_history

  •     history -w /path/filename.txt 将历史记录写入指定文件

  •     history -n 将未读过的历史从文件中读取

  •     history -r 将所有的历史从文件中读取\

    

    

    在使用命令history时,可以修改与其相关的一些变量,使其显示出不同要求的结果。

    HISTSIZE:命令历史记录的条数

    HISTFILE:指定历史文件,默认为~/.bash_history

    HISTFILESIZE:命令历史文件记录历史的条数

    HISTTIMEFORMAT=“%F %T “   显示时间

    HISTIGNORE=“str1:str2:… “ 忽略string1,string2历史

    控制命令历史的记录方式:

    环境变量:HISTCONTROL

    ignoredups 默认,忽略重复的命令,连续且相同为“重复” 

    ignorespace 忽略所有以空白开头的命令

    ignoreboth 相当于ignoredups, ignorespace的组合

    erasedups 删除重复命令

    

(6)ls

    用来列出所在目录的内容,或者指定目录的内容。

  •     ls -a 显示所有文件

  •      ls -A 显示所有文件,除.、..

  •      ls -l 长列出,列出文件的详细信息

  •      ls -R 递归

  •      ls -ld 显示指定目录的详细信息

  •      ls -1 竖显示

  •      ls -i 显示inode号


    

    

4.帮助命令

    在使用Linux系统时,会遇到许多命令,有些命令的用法很多,不容易记住。当遇到不会的命令时,可以查看系统里面的帮助文档,这就需要通过whatis,help,man来查看帮助文档。

(1)whatis 

    显示命令的简短描述,每晚使用一个数据库更新,刚安装后不可立即使用。

    

(2)help

    help 内部命令    //查看内部命令的用法

    外部命令 --help或-h    //查看外部命令用法

(3)man

    man命令可以查看到一个命令的详细使用方法,还可以查看配置文件的配置说明,这些文档都是命令作者提供的,是非常权威正确的。使用man+命令或文件名进行查询,会出现一种问题,如果命令名和文件名一样时,是查的哪一个,比如命令passwd和文件/etc/passwd,当用man passwd查询时,查的是哪一个呢?man查询结果会分为以下几类,确定要查询的分类,在进行查询。比如查passwd的配置文件,就可使用man 5 passwd查询。


  • 1: 用户命令 

  • 2: 系统调用

  • 3: C库调用

  • 4: 设备文件及特殊文件

  • 5: 配置文件格式

  • 6: 游戏

  • 7: 杂项

  • 8: 管理类命令

  • 9: Linux内核API

5.文件管理

(1)文件系统结构

    Linux系统中的文件呈现一个树形结构,最上边的是一个根目录"/",下面分出其他目录,目录可以在分出其他目录。可以看到,在根下的目录有很多,每个目录的功能都会有所不同,大致为以下内容。



  • /boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器,(bootloader, grub)都存放于此目录

  • /bin:供所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序

  • /sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序

  • /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)

  • /lib64:专用于x86_64系统上的辅助共享库文件存放位置

  • /etc:配置文件目录

  • /home/USERNAME:普通用户家目录

  • /root:管理员的家目录

  • /media:便携式移动设备挂载点 v/mnt:临时文件系统挂载点

  • /dev:设备文件及特殊文件存储位置 b: block device,随机访问 c: character device,线性访问

  • /opt:第三方应用程序的安装位置

  • /srv:系统上运行的服务用到的数据

  • /tmp:临时文件存储位置

  • /usr: universal shared, read-only data

  •     bin: 保证系统拥有完整功能而提供的应用程序 sbin:

  •     lib:32位使用 lib64:只存在64位系统

  •     include: C程序的头文件(header files)

  •     share:结构化独立的数据,例如doc, man等 local:第三方应用程序的安装位置

  • /var: variable data files

  •     cache: 应用程序缓存数据目录 

  •     lib: 应用程序状态信息数据

  •     local:专用于为/usr/local下的应用程序存储可变数据; lock: 锁文件

  •     log: 日志目录及文件 opt: 专用于为/opt下的应用程序存储可变数据;

  •     run: 运行中的进程相关数据,通常用于存储进程pid文件 spool: 应用程序数据池

  •     tmp: 保存系统两次重启之间产生的临时数据

  • /proc: 用于输出内核与进程信息相关的虚拟文件系统

  • /sys:用于输出当前系统上硬件设备相关信息虚拟文件系统

  • /selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置


    Linux中的文件名是区分大小写的,文件名的后缀没有实际意义,只是为了方便文件的分类。

    下图创建一个1.txt文件,用cat查看内容,将文件后缀改为mp3,还是可以查看,不会生成一个音乐文件。

    


    Linux中文件不是以后缀来分类的,要查看一个文件的类型,可以通过ls -l命令查看,结果第一位就是文件类型。一般用字符进行表示,字符的含义如下:

    

  •     -:普通文件

  •     d: 目录文件 

  •     b: 块设备

  •     c: 字符设备

  •     l: 符号链接文件

  •     p: 管道文件pipe

  •     s: 套接字文件socket

    

    

    

(2)文件时间戳

    一个文件包含2中数据,metadata 元数据和data 数据。元数据包括文件的权限,连接数,所属用户,所属组,访问时间等等。每个文件都会有三个时间戳,分别如下:

    

  •     access time:访问时间,atime,读取文件内容 

  •     modify time: 修改时间, mtime,改变文件内容(数据) 

  •     change time: 改变时间, ctime,元数据发生改变

    当文件的数据和元数据改变时,atime,mtime,ctime也会发生相应的变动。查看一个文件的状态,用命令stat+文件名。举例如下:

  •     编辑一个文件,内容abc,用stat查看文件的三个时间戳。访问文件后,再查看,发现atime改变

    

  •     在文件中加入新数据,三个时间戳都改变

    

  •     修改文件权限,只改变了ctime

    

  •     vim 123文件,加入内容,!q强制退出不保存,atime改变;但是再做这个操作,atime就不会变了.

    


(3)通配符

    通配符可以匹配成相应的字符,当查找一些特定的文件时,使用通配符可以快速查找。通配符的表示和对应的字符如下:

  • * 匹配零个或多个字符

  • ? 匹配任何单个字符

  • [0-9] 匹配数字范围

  • [a-z]:字母,匹配aAbB..yYz中的任意字母

  • [A-Z]:字母,匹配AbB..yYzZ中的任意字母

  • [wang] 匹配列表中的任何的一个字符

  • [^wang] 匹配列表中的所有字符以外的字符

  • [:digit:]:任意数字,相当于0-9

  • [:lower:]:任意小写字母 

  • [:upper:]: 任意大写字母

  • [:alpha:]: 任意大小写字母

  • [:alnum:]:任意数字或字母

  • [:blank:]:水平空白字符,即空格符

  • [:space:]:水平或垂直空白字符,即空格和换行符

  • [:punct:]:标点符号

    下面是一些简单举例:1是查找包含[a-z]中字母的文件,2是查找包含[A-Z]中字母的文件,3是查找以数字开头且只有2个字符的文件,4是查找以非字母开头的文件。


(4)文件的复制cp

    在windows系统中,我们可以通过鼠标右键的复制粘贴来将文件或目录复制粘贴到指定位置。在Linux中要复制文件,需要用到cp命令。在将源文件SOURCE复制到目标文件DEST时,分多种情况,如下图所示:

    

    2,6,9的情况举例如下

    

    了解cp使用的各种情况后,想要使用cp命令产生一些特殊结果,可以加上不同的选项。

    cp命令的相关选项

  • -i:覆盖前提示     //在Linux中cp是cp -i的别名

  • –n:不覆盖,注意两者顺序

  • -r, -R: 递归复制目录及内部的所有内容

  • -a: 归档,相当于-dR --preserv=all

  • -d:--no-dereference --preserv=links 不复制原文件,只复制链接名    //文件是一个链接时,不复制原文件,复制链接

  • --preserv[=ATTR_LIST]    //文件复制时,不加选项,不会复制元数据,加上对应选项会将对应元数据复制

  • mode: 权限

  • ownership: 属主属组

  • timestamp: 时间戳

  • all:文件的所有元数据也复制过去    

  • -p: 等同--preserv=mode,ownership,timestamp

    

    如下图,复制了/etc/passwd,但是访问时间会改变,加上-p,元数据中访问时间也没有改变了。
    

(5)文件的移动mv

    mv命令是将文件进行移动,将文件移动到指定位置,执行命令成功后,原文件就不存在了。相关选项如下:    

    -i:覆盖前提示

    -f: 强制覆盖

    系统中的mv是mv -i的别名,自动添加了-i。

(6)inode表和软硬连接

  •     inode表

    inode是索引节点,包含文件的元数据和只想磁盘上数据的指针,inode表包含文件系统所有文件的列表。创建一个文件时,在inode表中生成一个新条目存放文件元数据,将元数据与这个文件的inode关联到一个目录项中。文件名不是存在数据中的,而是存在其所在的目录中。当访问一个文件时,大致路径如下:

    

    目录中的文件名->对应的inode号->在inode表中找到文件的元数据和指向磁盘的指针->找到磁盘上对应的数据


  •     硬链接

    创建硬链接,就是在目录下,将不同文件名与相同的inode号关联到相对应的目录项中,访问这些文件时,都是访问同样区域磁盘上的数据。创建时连接数增加,不能跨分区或驱动器创建,不能对目录创建硬链接。语法格式及相关举例如下:

    ln  filename  linkname

    在/app下有一个123文件,inode为11,创建一个硬链接文件为/app/test/abc,查看2个文件的indoe号都为11,相同。访问2个文件的数据都是磁盘中存放的相同数据。

    


  • 软连接

    创建软连接就是将一个符号链接指向另一个文件,一个符号链接的内容是它引用文件的名称,可以对目录进行创建,可以跨分区指向的是另一个文件的路径,其大小为指向的路径字符串的长度,不增加或减少目标文件inode的引用计数。语法格式和举例如下:

    ln -s filename linkname

    下图中,在不同目录下创建了2个软连接。1中创建后,显示红色,说明有问题;2中却创建成功,这是什么原因呢?创建一个软连接,链接文件存放的是创建的原文件的目录。1中存放的为一个相对路径,当访问/app/test/123.soft时,不能在test目录下找到123文件,所以报错;2中,在访问/app/123.soft时,123.soft存放的为路径123,就相当于访问/app/123,可以正常访问。以后创建软链接时,注意链接文件所在目录。

    


6.重定向和管道

(1)重定向

    重定向是指将输入输出的结果的位置进行改变,重定向的符号有以下几种:

    > 正确输出

    2> 错误输出

    &> 全部输出

    >可以更换成>>,文件不存在时,>和>> 都能创建新文件,文件已存在时 >表示覆盖,>>表示追加

    2>&1 把错误的结果转成正确的结果

    1>&2 把正确的结果转成错误的结果

    COMMAND > /path/to/file.out 2> /path/to/error.out 把一个命令产生的正确的结果输入到指定文件,错误结果指向另一个文件

    COMMAND > /path/to/file.out 2>&1  正确错误结果都重定向到同一个文件中


    1中把正确结果重定向到文件txt;2中把aa重定向到txt,但原先的11会被覆盖;3中表示追加;4和5表示>不能重定向错误结果,2>可以。
    

    在普通用户下,用find查找/etc下以.conf为结尾的文件,正确结果重定向到right,错误结果重定向到error。

    


(2)管道

    Linux中的管道用于把前面命令的结果交给后面的命令处理,用符号"|"表示,但是只能将正确结果传给后面的命令,如果想将错误正确的都传给后面的命令,要用符号"|&"。经常与管道符连用的有tr和tee命令。

    tr命令用来转换和删除字符,常用选项如下:   

  •     -c   --complement:取字符集的补集

  •     -d   --delete:删除所有属于第一字符集的字符    //-cd连用,表示只留下指定字符,其他字符删除

  •     -s   --squeeze-repeats:把连续重复的字符以单独一个字符表示

    tr命令中相关字符的表示方法:[:alnum:]:字母和数字 [:alpha:]:字母 [:cntrl:]:控制(非打印)字符 [:digit:]:数字 [:graph:]:图形字符 [:lower:]:小写字母 [:print:]:可打印字符 [:punct:]:标点符号 [:space:]:空白字符 [:upper:]:大写字母。

    tee命令用来把前一个命令的结果保存到文件中,并把结果在传给后一个命令处理。

    格式如下:

    命令1 | tee [-a ] 文件名 | 命令2    把命令1的STDOUT保存在文件中,做为命令2的输入,-a 追加


    相关举例如下:

    1中将小写字母换成大写输出;2中删除除a的字母;3中,123与abc对应;4中123对应abc,45对应c;5中,先把结果交给tee处理,保存到mp.txt后,再把命令交给tr处理。

    


7.总结

    通过一周时间的学习,对Linux有了初步的了解,一些命令的选项没有记得的太牢固。对于一些知识理解的不太深刻,像软硬链接这一块会用一些简单的命令,但在内存中的工作原理和机制还是不太理解。其他一些地方也有一些不足,只会机械性的用命令,不太理解一些命令的工作机制,到底是如何实现这种结果的?这些是以后学习中需要注意的。