1. 用户登录

1. 用户登录

root 用户

一个特殊的管理帐户
也被称为超级用户
root已接近完整的系统控制
对系统损害几乎有无限的能力
除非必要,不要登录为 root

普通( 非特权 )用户

权限有限
造成损害的能力比较有限

注意点1

  • linux里面的root和user的权限不是看名字决定的,而是看编号名决定,管理员id都是0,user不是0. 可以用 id -u (id -u zhang) 来查看用户ID.
  • Centos6中普通账户编号从500开始,Centos7中从1000开始

2. 终端terminal—{tty,who,whoami,who am i,w}

  • 设备终端
    键盘鼠标显示器
  • 物理终端( /dev/console )
    控制台console
  • 虚拟终端(tty: teletypewriters, /dev/tty# )
    tty 可有n个, Ctrl+Alt+F#,注意这个指的是在机器前利用按键虚拟出来的多个终端,和下面的pts通过SSH远程连接的终端不同
  • 图形终端( /dev/tty7 ) startx, xwindows
    CentOS 6: Ctrl + Alt + F7
    CentOS 7: 在哪个终端启动,即位于哪个虚拟终端
  • 串行终端( /dev/ttyS# )
    ttyS
  • 伪终端( pty: pseudo-tty , /dev/pts/# )
    pty, SSH远程连接
  • 查看当前的终端设备:
    tty

注意点2

  • 切换图形接口界面和命令行接口界面 ctrl+alt+F1,F2,F3,F4
    相当于增加了多个终端,且每个终端都可以登录同一个账号或者不同账号,linux天生支持多用户登陆。
    但是要注意它并没有关闭图形界面或者任何界面,他仅仅是增加了一个终端。,其中F1是图形界面(假如开机后是图形界面的情况下)

  • 图形界面的右下角有4个工作区域(centos7),centos6有俩。

  • 终端:不论用什么界面登陆都需要一个终端。远程SSH基本是虚拟终端/dev/pts/# ,机上基本是/dev/tty#. 可以用tty指令来查看当前的终端信息和编号。也可用下面的命令查看当前的登录账号等

    tty 查看当前终端 whoami 可以查看当前终端登录账户 who am i可以查看当前账户和终端号等详细信息 who 可以查看当前所有终端和账户信息 w 则还可以查看当前各个终端用户的操作

3. shell

也被称为系统编译器(计算机中均为二进制0101存储数据,必须用编译器将人类能理解的字符翻译为机器用的0101底层指令)
它是linux下的一种交互式接口,也可以用来编程脚本。
因为开源,所以有很多种shell。linux主要用bash shell, 在sh上的升级版。
可以用 echo ${SHELL} 来查询本机所用的shell 。(shell大写,花括号可以不敲入)
可以用 cat /etc/shells查看本机所装的所有shells.
不同的shell命令有些不一样,shell集成的命令都是内部命令。

4. 命令提示符—{$PS1}

  • 命令提示符: prompt [root@localhost ~]#
    # 管理员
    $ 普通用户

  • 显示提示符格式 [root@localhost ~]#echo $PS1

  • 修改提示符格式

    PS1="\[\e[1;5;41;33m\][\u@\h \W]\\$\[\e[0m\] " PS1="\[\e[1;32m\][\[\e[0m\]\t \[\e[1;33m\]\u\[\e[36m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$ " \e 控制符\033 \u 当前用户 \h 主机名简称 \H 主机名 \w 当前工作目录 \W 当前工作目录基名 \t 24小时时间格式 \T 12小时时间格式 \! 命令历史数 \# 开机后命令历史数
  • 下面的\[\]在表达颜色的时候其实没有必要输入,不过在PS1中则会导致xshell自动换行时出问题,所以最好要加上(使每项都使用上面那一行)

    建议生产环境中: PS1="[\[\e[1;41m\]\t \u@\h \[\e[0m\]\w]\\$ " # PS1="[\e[1;41m\t \u@\h \e[0m\w]\\$ " 灰度发布环境中: PS1="[\[\e[1;43m\]\t \u@\h \[\e[0m\]\w]\\$ " # PS1="[\e[1;43m\t \u@\h \e[0m\w]\\$ " 测试环境中: PS1="[\[\e[1;42m\]\t \u@\h \[\e[0m\]\w]\\$ " # PS1="[\e[1;42m\t \u@\h \e[0m\w]\\$ "
  • 注意在一个窗口终端中修改PS1只能修改这个窗口终端的bash的PS1环境变量;因此要把PS1的配置写入文件设置中才可保存下来。也可以说是如果只在PS1修改,仅仅是内存中存入,开机无法存入,所以必须写入文件中,后缀必须sh,文件名可以自己写。

    /etc/profile.d/####.sh /etc/profile.d/env.sh

注意点3

  • 颜色提示符的各个不同颜色和效果的数字,比如31,1,43等等,只要是在m字符前面的,比如说\e[1;3;43;31m],这些并不管顺序如何,都会生效。
  • 但是需要注意的是,这些颜色的字符是按照从左往右的顺序起效的,如果从左往右的数字控制的类别并不冲突,比如说高亮1和闪烁5不冲突,那么他俩都会生效;但是如果是同一类别的,比如说字体颜色30类别和背景颜色40类别的,则只有最后一个(最右边的一位)生效,因为它把前面生效的给覆盖了。
  • 特殊的就是0,输入0之后直接把前面的所有的效果都给取消了,可以用这个性质,想要改变效果的时候直接在想要改变的位置前面输入\e[0;XX;XXm]即可,其中0前面的颜色等效果被全部清除,0后面的输入的效果继续生效。

5. 执行命令:内部命令和外部命令—{enable,help,type,which,whereis}

  • 输入命令后回车
    提请shell程序找到键入命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来

  • 在shell中可执行的命令有两类

    • 内部命令:由shell自带的,而且通过某命令形式提供,不同的shell内部命令不同
    help 查看所有内部命令列表,其中被禁用的命令前面有个*号 enable cmd 启用特定的cmd内部命令 enable –n cmd 禁用特定的cmd内部命令 enable –n 查看所有禁用的内部命令 enable 查看所有启用的内部命令 enable -a 查看所有的内部命令,包括没有启用的
    • 外部命令:在文件系统路径下有对应的可执行程序文件
    查看路径: which which指令会在环境变量$PATH设置的目录里查找符合条件命令,因此它找不到内部命令。 which -a cmd 查看所有的符合cmd外部命令地址,不仅仅是在优先级寻找中找到的第一个命令 which --skip-alias 不寻找alias别名定义的命令 whereis 查找二进制文件、源代码文件和man手册页
    • 注意which命令在shell中默认被设置为一个别名,它别名中就包含了-i的选项,也就是寻找命令中别名的位置(无需自己多打一个-i的选项);但它的别名中没有包含-a的选项,也就是说它只按照命令寻找路径优先级找到的第一个命令的位置。同时这个别名在启动的时候的定义位置在/etc/profile.d/which2.sh/etc/profile.d/which2.csh中,分别针对不同的shell都做了别名。

    • 区别指定的命令是内部或外部命令

    type COMMAND

注意点4

  • 外部命令没有内部命令执行速度快,但它同样速度也很快是因为有搜索路径,存储在PATH变量中,可以用echo $PATH 查看。
  • 当shell执行一个命令,如果不是一个内部命令,那么它就会去按照下面的优先级去搜索这个命令的位置。
  • 优先级:别名》内部命令》hash表存储》外部命令PATH从前到后》在文件夹内直接输入可执行文件名称进行命令的执行
  • 在文件夹目录中直接输入可执行文件名称的时候,会按照优先级顺序来执行的,当然则如果写的是可执行文件的绝对路径,那么它就直接执行了(也可以看做优先级最高)
  • 内部命令速度快,优先级高,它本身在系统启动后进入shell之后就在内存中了,所以如果有一个外部命令和它重名,也是先执行内部命令(比如echo,test就是内部外部都有的命令)。
  • 外部命令第一次执行是按照PATH来寻找,如果找到了,第一次执行后就把命令的可执行文件位置存在内存中了(缓存),之后就不再寻找了,这个缓存便存储在hash表中,一但注销便清空hash表,hash本身也是一个内部命令

6. 执行外部命令—{hash}

Hash缓存表

系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中(缓存中),当再次使用该命令时, shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率

hash常见用法

```
hash                显示hash缓存
hash –l             显示hash缓存,可作为输入使用
hash –p path name   将命令全路径path起别名为name
hash –t name        打印缓存中name的路径
hash –d name        清除特定的某一条name缓存
hash –r             清除全部缓存
```

注意点5

  • hash表是在缓存中的,所以只要注销重新登录(或者重新远程连接)就会自动清空。注意利用Xshell远程连接的每个终端其实都是一个子shell,因此不同的终端中的hash表也是不一样的。

7. 命令别名—{alias,unalias,source}

  • 显示当前shell进程所有可用的命令别名
    alias
  • 定义别名NAME,其相当于执行命令VALUE
    alias NAME='VALUE'
  • 在命令行中定义的别名,仅对当前shell进程有效
  • 如果想永久有效,要定义在配置文件中
    仅对当前用户: ~/.bashrc
    对所有用户有效: /etc/bashrc
    同样也可自己定义在自定义的 /etc/profile.d/env.sh中
  • 别名 alias ~/.bashrc(只对当前用户) /etc/bashrc(所有用户)
  • 编辑配置给出的新配置不会立即生效
  • bash进程重新读取配置文件
source /path/to/config_file . /path/to/config_file
  • 撤消别名: unalias
unalias [-a] name [name ...] -a 取消所有别名
  • 如果别名同原命令同名,如果要执行原命令,可使用
\ALIASNAME 斜杠加原始命令(和别名重名,这里直接用别名标注) “ALIASNAME” ‘ALIASNAME’ command ALIASNAME 前面加个command /path/commmand 直接写上原始命令的地址 注意直接输入原始命令的话就会执行别名了,因为别名的优先级最高

8. 日期和时间—{date,clock,cal,timedatectl}

  • Linux的两种时钟 系统时钟:由Linux内核通过CPU的工作频率进行的(软件计时) 硬件时钟:主板(硬件计时)
  • 相关命令
------- date 显示和设置系统时间 ------- date +%s 显示从1970/01/01开始过去了多少秒 date -d @1509536033 将从1970/01/01过去多少秒的时间显示出来,以默认格式 date -d +2days 显示两天后的时间 date -d "-1week +2hours" 显示一周前并过去两个小时的时间 date "+%F %X" 看帮助,显示年月日和时分秒 date +'%F%r' 同上 常用 date -d +2days +%F 显示两天后的时间,并且只显示年月日(也就是以特定格式显示自己选定的某一天) date +'%F %R:%S' 年月日时分秒 date "+%F %T" 同上,年月日时分秒 date +%Z 显示时区,其中CST代表4个时区,包括中国标准时间 date -u 显示UTC时间 date MMDDhhmm[[CC]YY][.ss] 设置当前系统时间为 月日时分[世纪]年.秒 date -s "CCYYMMDD hh:mm:ss" 清晰明了的设置时间 更多查看帮助,写的很清晰明了 ------ 注意点 ------------ 1.在'date +'加号后面的添加的字符中,除了%后面的格式字符会转换以外,其他添打的字符都会出来,比如说date +"%F 123 +%x" ,这中间的‘空格123空格’都会原样打出来。 2.时钟格式中的默认是利用0来填充月份日期是单位数的情况的(比如1月填充为01),如果想修改的话,看帮助中写的有,可以在%的后面加上"- _ 0"来修改填充的格式,当然同时也可用"^ #"来修改输出的大小写字母。 3.工作中经常配合时间命令、反向单引号、花括号来生成多个文件,以便于今后利用筛选功能筛选文件。 例如: touch /data/`date -d "+1 day" +%F`.log touch /data/`date +"%F_%T"`.{log,txt} ------- hwclock, clock: 显示硬件时钟 ------ -s, --hctosys 以硬件时钟为准,校正系统时钟 -w, --systohc 以系统时钟为准, 校正硬件时钟 ------- timedatectl 显示时区等信息 ------------- timedatectl list-timezones 显示时区 timedatectl set-timezone Asia/Shanghai 设置为上海时区
  • 时区: /etc/localtime (它是一个软链接,指向时区文件)
ll /etc/localtime lrwxrwxrwx. 1 root root 35 May 26 00:33 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
  • 显示日历: cal –y

9. 关机相关命令—{halt, poweroff,reboot,shutdown}

  • 关机: halt, poweroff
  • 重启: reboot -f: 强制,不调用shutdown -p: 切断电源
  • 关机或重启: shutdown
shutdown [OPTION]... [TIME] [MESSAGE] -r: reboot -c:cancel -h: halt TIME:无指定,默认相当于+1( CentOS7) now: 立刻,相当于+0 +m: 相对时间表示法,几分钟之后;例如 +3 hh:mm: 绝对时间表示,指明具体时间(一般指的是当天的绝对时间) 并且如果指定了时间TIME的参数进行关机任务,则在关机前5分钟将会创建/run/nologin 禁止新的登录

10. 切换runlevel工作模式—{init}

把系统的runlevel切换为不同的模式,这个和之前的利用快捷键打开更多的界面终端不同,这个直接就是真正的切换工作模式,关闭图形界面等等。

init 3:字符界面 init 5:图形界面 init 0:关机 init 6:重启

11. screen多用户共同屏幕—{screen,df,rpm}

主要用于远程操作防SSH掉线(这个功能在工作中很常用)以及防止任务时间过长导致任务失败(人走开任务失败),或者多用户相互帮助操作。

screen –S(大写) [SESSION] 创建新screen会话,以SESSIO为名字代替[tty].[host] exit 在screen内,退出并关闭screen会话 kill PID1 PID2 ... 在screen外,强制关闭screen会话窗口,需要用screen -ls查看PID先 Ctrl+a,d(或Ctrl+d) 退出当前screen会话(注意是先按a再按d,否则只按d就是关闭了screen) Ctrl+c 在screen内,强行终止screen(+d也可其实,不过没有+c来的厉害) screen -ls 显示所有已经打开的screen会话 screen -r [SESSION] 恢复进入某screen会话,可以输入PID也可输入用-S定义的SESSION名 screen –x [session] 加入某个已经被attach的screen会话(只有一个的时候,多个的话用-r)。 用这个命令可以让不同的ssh端口显示相同的命令,可以帮助别人进行命令的操作 screen -d 在screen内部退出screen而不关闭此screen,相当于快捷键Ctrl+a,d --------------------------- screen -dms Session : 这个命令相当于开启一个后台的Session,可以再里面运行自己的各种后台脚本等等 --------------------------- Ctrl+a,c 在screen内部创建一个新的bash窗口并进入它(screen的标号+1) Ctrl+a,n或者p 在screen内部切换自己创建的不同的screen窗口 Ctrl+a,ctrl+a 在screen内部切换自己当前和前一个screen窗口,来回切换 Ctrl+a,w 在screen内部显示自己创建的所有的screen窗口,这个会显示在Xshell的最上方标题栏上面 注意上面的所有的命令都是在一个screen中进行的,相当于在一个screen中开启多个交互式的bash,并可以随意在其中间切换;并没有开启更多的screen

注意点6

  • 需要先安装screen, 用df命令找到光盘挂载点(如果在vmware中必须登录到图形界面先,才有光盘挂载点) 然后用 rpm -ivh ……..Packages/screen—XXX 安装即可
  • 必须是连接的同一台电脑,同一个用户账户
  • TAB按键用来补全,一级命令补全,子命令补全(centos7),路径和文件名补全。

12. echo命令

  • 功能:显示字符
  • 语法: echo [-neE][字符串]
  • 说明: echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号
选项: -E (默认)不支持 \ 解释功能 -n 不自动换行 -e 启用 \ 字符的解释功能
  • 显示变量
echo "$VAR_NAME" 变量会替换,弱引用 echo '$VAR_NAME' 变量不会替换,强引用简单命令
  • 启用命令选项-e, 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出
\a 发出警告声 \b 退格键 \c 此符号后续的输出不再显示,同时也不会换行 \e escape,相当于\033 \n 换行且光标移至行首 \r 回车,即光标移至行首,但不换行 \t 插入tab \\ 插入\字符 \0nnn 插入nnn(八进制)所代表的ASCII字符 echo -e '\033[43;31;5mzhang\e[0m' \xHH 插入HH(十六进制)所代表的ASCII数字( man 7 ascii)

13. 字符集和编码—{$LANG,/etc/motd}

ASCII码

计算机内部,所有信息最终都是一个二进制值。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。ASCII 码一共规定了128个字符的编码,占用了一个字节的后面7位,最前面的一位统一规定为0

Unicode

用于表示世界上所有语言中的所有字符。 每一个符号都给予一个独一无二的编码数字, Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号。 Unicode 仅仅只是一个字符集,规定了每个字符对应的二进制代码,至于这个二进制代码如何存储则没有规定

  • Unicode编码方案
    UTF-8:变长, 1到4个字节
    UTF-16:变长, 2或4个字节
    UTF-32:固定长度, 4个字节
  • UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,可变长存储。使 用 1 – 4 个字节表示一个字符,根据字符的不同变换长度。编码规则如下:
    • 对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode码。 因此,对于英文中的 0 – 127 号字符,与 ASCII 码完全相同。这意味着ASCII 码的文档可用 UTF-8 编码打开
    • 对于需要使用 N 个字节来表示的字符( N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N – 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码来填充
  • 编码转换和查询:
    http://www.chi2ko.com/tool/CJK.htm
    https://javawind.net/tools/native2ascii.jsp?action=transform
    http://tool.oschina.net/encode
[00:34:39 root@Centos6 ~]# echo $LANG en_US.UTF-8
  • 示例: linux基础知识插图

“汉”的 Unicode 码 0x6C49( 110 110001 001001),需要三个字节存储,格式为: 1110xxxx 10xxxxxx 10xxxxxx,从后向前依次填充对应格式中的 x,多出的 x 用 0 补,得出UTF-8 编码为 11100110 10110001 10001001
“马” 的 Unicode 码 0x9A6C( 1001 101001 101100),需要三个字节存储,格式为: 1110xxxx 10xxxxxx 10xxxxxx,从后向前依次填充对应格式中的 x,多出的 x 用 0 补,得出UTF-8 编码为11101001 10101001 10101100

14. 命令行扩展、被括起来的集合

命令行扩展: $( ) 或 “

把一个命令的输出打印给另一个命令的参数

输入:echo "This system's name is $(hostname) " 输出:This system's name is server1.example.com 输入:echo "i am `whoami` " 输出:i am root 输入:echo "Today is `date +%F`" 输出:Today is 2020-01-01 输入:touch /data/`data +%F`.log 输出结果则是:生成 “年月日.log”的文件

花括号扩展: { } — {touch}

打印重复字符串的简化形式

echo file{1,3,5} 结果为: file1 file3 file5 rm -f file{1,3,5} echo {1..10} echo {a..z} echo {0..20..2} echo {20..0..2} echo {a,3,z}.{txt,log} echo {a,3,z}.{txt,log}.{www.eee} echo {a,3,z}.{txt,log}.file

15. tab键{bc,cat}

命令补全

内部命令:        
外部命令: bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻以给定命令名命名的文件,第一次找到的命令即为要执行的命令      
用户给定的字符串只有一条惟一对应的命令,直接补全     
否则,再次Tab会给出列表         

路径补全

把用户给出的字符串当做路径开头,并在其指定上级目录下搜索以指定的字符串开头的文件名     
如果惟一:则直接补全     
否则:再次Tab给出列表      

16. 命令行历史

  • 保存你输入的命令历史。可以用它来重复执行命令
  • 登录shell时,会读取命令历史文件中记录下的命令$HOME/.bash_history(当前用户的家目录下)
  • 登录进shell后新执行的命令只会记录在缓存中;这些命令会用户退出shell时才会“追加”至命令历史文件中,并且只追加到当前用户的家目录下的历史文件中

  • 重复前一个命令,有4种方法
    • 重复前一个命令使用上方向键,并回车执行
    • 按 !! 并回车执行
    • 输入 !-1 并回车执行
    • 按 Ctrl+p 并回车执行
  • !:0 执行前一条命令(去除参数)
  • Ctrl + n 显示当前历史中的下一条命令,但不执行
  • Ctrl + j 执行当前命令
  • !n 执行history命令输出对应序号n的命令
  • !-n 执行history历史中倒数第n个命令
  • !string 重复前一个以“string”开头的命令
  • !?string 重复前一个包含string的命令
  • !string:p 仅打印命令历史,而不执行
  • !:p打印输出!:p 打印输出 ! (上一条命令的最后一个参数)的内容
  • !:p 打印输出 !(上一条命令的所有参数)的内容
  • ^string 删除上一条命令中的第一个string
  • ^string1^string2 将上一条命令中的第一个string1替换为string2
  • !:gs/string1/string2 将上一条命令中所有的string1都替换为 string2

常用

  • 使用up(向上)和down(向下)键来上下浏览从前输入的命令
  • ctrl-r来在命令历史中搜索命令
    • ( reverse-i-search) `’ :
    • 搜索输入字符之后然后按回车即可执行,也可以按方向键的左右按键打印出来到命令行但是不执行。
  • Ctrl+g:从历史搜索模式退出
  • 要重新调用前一个命令中最后一个参数
    • !$ 表示
    • Esc, .(点击Esc键后松开,然后点击 . 键)
    • Alt+ .(按住Alt键的同时点击 . 键)

17. 调用历史参数

  • command !^ 利用上一个命令的第一个参数做cmd的参数
  • command !$ 利用上一个命令的最后一个参数做cmd的参数
  • command !* 利用上一个命令的全部参数做cmd的参数
  • command !:n 利用上一个命令的第n个参数做cmd的参数
  • command !n:^ 调用第n条命令的第一个参数
  • command !n:$ 调用第n条命令的最后一个参数
  • command !n:m 调用第n条命令的第m个参数
  • command !n:* 调用第n条命令的所有参数
  • command !string:^ 从命令历史中搜索以 string 开头的命令,并获取它的第一个参数
  • command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它的最后一个参数
  • command !string:n 从命令历史中搜索以 string 开头的命令,并获取它的第n个参数
  • command !string:* 从命令历史中搜索以 string 开头的命令,并获取它的所有参数
  • command !string:^ 从命令历史中搜索以 string 开头的命令,并获取它的第一个参数
  • command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它的最后一个参数
  • command !string:n 从命令历史中搜索以 string 开头的命令,并获取它的第n个参数
  • command !string:* 从命令历史中搜索以 string 开头的命令,并获取它的所有参数

18. 命令history—{history}

------------------------------- history [-c] [-d offset] [n] -c: 清空命令历史; 1.但注意只是清除当前登录的shell中的缓存中的历史命令,而并没有清除历史文件中的历史命令; 2.因此退出后再重新登录shell后,虽然上次登录时操作的命令会被清除,但上次登录之前的历史命令因为在文件中所以仍然存在会被再次读入缓存中。 3.这个历史文件默认是$HISTFILE(这个$HISTFILE默认设置是登录用户家目录下面的隐藏历史文件.bash_history),如果$HISTFILE其它有值的话,则用它本身输入的值,没有的话,则使用~/.bash_history(也就是用户家目录下的隐藏历史文件) -d offset: 删除历史中指定的第offset个命令 n: 显示最近的n条历史 ------------------------------- history -anrw [filename] 注意这里历史文件filename不指名的话默认是$HISTFILE,如果它也不存在的话就是~/.bash_history,也就是当前登录用户的家目录下面的隐藏历史文件,上面也说了。 -a: 追加本次会话(登录shell后)新执行的命令历史列表至历史文件(执行命令后可以用cat .bash_history查看是否追加进去了),而不是只有退出shell的时候才会追加。 -r: 读历史文件中的历史命令,添加到当前shell的缓存历史列表中 -w: 写入历史列表到指定的历史文件(如果不添加任何文件就是直接保存到默认的历史文件中去了) -n: 读历史文件中未读过的行到历史列表 ------------------------------- history -ps arg [arg...] -p: 展开历史参数成多行,但不存入在历史列表中 -s: 展开历史参数成一行,附加在历史列表后 例如:-p [00:42:37 root@Centos6 ~]# history -p cat 23 echo 42423 `hostname` cat 23 echo 42423 Centos6.localdomain -s 如果执行上面的命令,则效果就是把上面命令的执行结果排列为一行并且放入当前shell缓存的历史列表中去。可以达到伪造历史的效果。

19. 命令历史相关环境变量—{$HISTSIZE,$HISTTIMEFORMAT}

  • HISTSIZE:命令行中历史命令所记录的条数,也就是内存中输出的历史命令行记录数量(最后的多少行),默认1000,在/etc/profile文件中修改。当然也可修改在自己的env.sh文件中,因为按照文件执行的顺序,自己的/profile.d/env.sh文件靠后,会把前面的文件中的变量给覆盖。下同,均可修改在自己的环境变量中。
  • HISTFILE:指定历史文件,默认为~/.bash_history
  • HISTFILESIZE:命令历史文件所能够记录的历史的条数,如没有单独设置则默认与HISTSIZE保持一致,也可单独修改
  • HISTTIMEFORMAT=“%F %T “ 显示时间,历史命令的时间格式
  • HISTIGNORE=“str1:str2*:… “ 忽略str1命令, str2开头的历史
  • 控制命令历史的记录方式:
    • 环境变量: HISTCONTROL
      • ignoredups 默认,忽略重复的命令,连续且相同为“重复”
      • ignorespace 忽略所有以空白开头的命令
      • ignoreboth 相当于ignoredups, ignorespace的组合
      • erasedups 删除重复命令
  • export 变量名="值“
  • 存放在 /etc/profile 或 ~/.bash_profile

20. bash的快捷键

  • Ctrl + l 清屏,相当于clear命令
  • Ctrl + o 执行当前命令,并重新显示本命令
  • Ctrl + s 阻止当前shell的屏幕输出,锁定(只是不显示输入的任何内容和指令了,但实际上仍然执行命令,可用+q重新输出)
  • Ctrl + q 允许屏幕输出
  • Ctrl + c 终止命令
  • Ctrl + z 挂起命令

  • Ctrl + a 光标移到命令行首,相当于Home
  • Ctrl + e 光标移到命令行尾,相当于End
  • Ctrl + f 光标向右移动一个字符
  • Ctrl + b 光标向左移动一个字符
  • Alt + f 光标向右移动一个单词尾
  • Alt + b 光标向左移动一个单词首
  • Ctrl + xx 光标在命令行首和光标之间移动
  • Ctrl + u 从光标处删除至命令行首
  • Ctrl + k 从光标处删除至命令行尾
  • Alt + r 删除当前整行
  • Ctrl + w 从光标处向左删除至单词首
  • Alt + d 从光标处向右删除至单词尾
  • Ctrl + d 删除光标处的一个字符
  • Ctrl + h 删除光标前的一个字符
  • Ctrl + y 将删除的字符粘贴至光标后
  • Alt + c 从光标处开始向右更改为首字母大写的单词
  • Alt + u 从光标处开始,将右边一个单词更改为大写
  • Alt + l 从光标处开始,将右边一个单词更改为小写
  • Ctrl + t 交换光标处和之前的字符位置
  • Alt + t 交换光标处和之前的单词位置
  • Alt + N 提示输入指定字符后,重复显示该字符N次
  • 注意: Alt组合快捷键经常和其它软件冲突
最后修改日期: 2021年7月7日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。