一、命令历史
概念:shell进程能够将之前执行过的命令保存记录下来
存储位置:
1、命令历史的文件
使用以下环境变量查看相关参数:
HISTFILE:查看文件地址(一般为.bash_histroty)
HISTFILESIZE:命令历史文件的大小
2、当前shell进程中,相当于内存缓存吧
使用以下环境变量查看相关参数:
HISTSIZE:可保留命令的历史的条数
查看命令历史:~] history
用法:
history [-c] [-d 偏移量] [n]
或 history -anrw [文件名]
或 history -ps 参数 [参数…]
-c:清空命令历史
-d offset:删除指定命令历史
-r : 从文件读取命令历史追加至历史文件中
-w:把历史列表中的命令追加至历史文件中
histroy #:显示最近的#条命令
调用历史列表中的命令:
!#:再一次执行历史列表中的第#条命令;
!!:再一次执行上一条命令,也可以用向上箭头;
!STRING:再一次执行命令历史列表最近一个以STRING开头的命令;
注意:命令的重复执行有时候需要依赖于幂等性(个人通俗理解,就是多次执行的结果都一样)
有时候需要重复使用上一条命令的最后一个参数:
快捷键:ESC,.(先按以下ESC,松开后紧接着按下.)
或输入字符串 !$ 即可代替上一条命令的最后一个参数
命令记录的一个特性:
是否记录重复,是否记录空白字符开头的
使用环境变量HISTCONTROL控制
1、ignoredups:忽略重复
2、ignorespace:忽略空白字符开头的
3、ignoreboth:两者都忽略
二、命令补全
为了提高用户的体验,能够简单准确地调用命令,当用户输入命令的部分字符时,可以敲tab建,shell会把已输入的字符作为开头去匹配命令,如果匹配到就补全这个命令。如果匹配到了多个或没有匹配到则不显示,这时候则可以再敲一次tab键,如果有匹配到多个,就会列出匹配到的命令以供选择。如果没有匹配到,则依然不显示。
路径补全,同命令补全。
三、命令行展开
命令行展开是针对于命令中需要输入多个路径时的一种合并简单写法
~:此符合作为路径时会自动展开(替换)为用户家目录,或指定用户家目录
{}:大括号里以逗号分隔的多项字符,会分别与大括号左后的内容进行拼接成多个路径;
例如:/tmp/{a,b}/d 会展开为两个路径:/tmp/a/d /tmp/b/d
四:命令执行状态结果
每条命令的执行结果都有一个对应的状态码,也成为退出码
0:成功
1-255:表示不同的失败
深入说明参考:
http://teliute.org/linux/abs-3.9.1/exitcodes.html
有的命令正常执行,也会返回一些执行结果。
返回结果,跟返回码的区别
返回码只是命令的执行成功与否。
结果是状态执行完毕产生的一些数据输出。
用特殊变量 $? 可以查看上一条执行命令的返回码。
执行结果的引用:
$(COMMAND)
`COMMAND`
五、快捷键
Ctrl+a:跳转到命令行的行首
Ctrl+e:跳转到命令行的行尾
Ctrl+u:删除光标位置到行首之间的字符
Ctrl+k:删除光标位置到行尾之间的字符
Ctrl+l:清屏
六、globbing(文件名通配,匹配的整体,也就是完全符合通配符)
匹配模式:元字符
*:匹配任意长度的任意字符
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
下面是几种特殊格式,他们代表某类字符组:
1、[a-z],[A-Z],[0-9],[a-z0-9]
2、[[:upper:]]:所有大写字母
3、[[:lower:]]:所有小写字母
4、[[:alpha:]]:所有字母
5、[[:digit:]]:所有数字
6、[[:alnum:]]:所有数字和字母
7、[[:space:]]:所有空白字符
8、[[:punct:]]:所有标点字符
[^]:匹配制定范围外的任意单个字符
如:[^[:upper:]]所有非大写字母
七、IO重定向
每个程序的执行都有输入数据和输出数据,程序的数据流有三种:
(1)、输入的数据流:<– 标准输入(stdin), 数据来源:键盘;
(2)、输出的数据流:–> 标准输出(stdout),数据去向:显示器;
(3)、错误的输出流:–> 错误输出(stderr),数据去向:显示器;
(一)、IO
概念:输入输出
[一]、输入 input
设备:文件、键盘、网卡等;
[二]、输出 output
设备:文件、显示器、网卡、打印机等;
(二)、重定向:也就是改变数据流的来源或去向。
[一]、多个命令时管道链接数据流入流出
概念:
链接命令,将前一个程序执行的结果直接定向到后一个程序当做输入数据流
用法:
COMMAND1 | COMMAND2 | COMMAND3 | …
特殊用法:
tee命令:
经常用在两个管道之间,将输入的数据接收保存到文件中,并把输入数据再次原样接力输出。
tee /PATH/TO/SOMEFILE
[二]、三种数据流分别对应的重定向方式:
█ 标准输出:
> /PATH/TO/SOMEFILE
>> /PATH/TO/SOMEFILE
区别:是否覆盖已存在的文件,> 覆盖文件,>> 追加文件中
可以设置是否允许覆盖
set -C: 不允许 > 覆盖,但仍然可以用 :> 强行覆盖
set +C: 关闭上述特性
█ 错误输出:
2> /PATH/TO/SOMEFILE
2>> /PATH/TO/SOMEFILE
合并以上两种输出到一个目标文件:
(1)、&>, &>>
(2)、
COMMAND > /path/to/somefile 2>&1
COMMAND >> /path/to/somefile 2>&1
█ 输入:
<
通常用在一些被动接收输入数据的命令上。如tr、cut等。
Here Document:
<< 文档输入模式,定义一个起始和结束符。例如以下在定义的特殊字符EOF后可以随意输入,所以换行,直到出现最后一行EOF字符结束输入
cat << EOF
cat /PATH/TO/SOMEFILE << EOF
八、命令hash
概念:
之前介绍过shell执行命令调用时,会在环境变量PATH所保存的目录下依次查找对应二进制程序。找到并调用之,但是每次查找会耗时,为了减轻耗时,会把调用过的命令缓存起来,加速命令调用。
存储格式:
键值对:比如你使用了次命令ls,那么会存一条: ls –> /usr/bin/ls
查看方法:
hash:默认列出存储的hash值,
-l,列出详细信息
-d COMMAND :删除某条命令的缓存
-r:清空
九、bash的变量
概念:
个人有编程经验,暂时不做解释
变量类型:
bash按个人理解应该属于弱类型变量,bash会把所有变量统统视为字符串;
既然是弱类型,无需声明,直接赋值使用即可。
变量名规则与规范:
只能包含数字、字母、下划线
不能以数字开头
不能使用编程语言的自身保留字
最好见名知义,明确表明变量所代表的意义
变量替换:
把命令中引用的变量,替换为对应内存空间上的数据。
作用范围:
本地变量:作用域为当前shell进程
环境变量:作用于为当前shell及其子进程
局部变量:作用于为代码片段(比如函数内的变量)
特殊变量:shell内置具有特殊功能的变量
$?:前面说过,表示命令执行返回状态码。
注意:bash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境
PATH, HISTFILE, HISTSIZE, HISTFILESIZE, HISTCONTROL, SHELL, HOME, UID, PWD, OLDPWD
变量声明:
name=value
默认为本地变量,在函数体内声明就是局部变量(纯属个人猜测),如需设为环境变量,需要导出为全局变量。
声明为环境变量:
(1)、export name=value
(2)、name=value
export name
(3)、declare -x name=value
(4)、name=value
declare -x name
变量引用:
${var_name} 当引用有歧义时,可用大括号表明
$var_name
查看变量:(列出当前shell可用变量,并非引用)
查看所有变量
set
查看环境变量
export, declare -x, printenv, env
撤销变量:
unset name
只读变量:
(1) declare -r name=value
(2) readonly name=value
只读变量无法重新赋值,并且不能撤销,声明周期为当前shell的生命周期,随shell的终止而终止。
十、多命令执行
(一)、按顺序执行
COMMAND1; COMMAND2; COMMAND3; …
(二)、逻辑控制执行
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
十一、bash的配置文件
配置文件的意义:
命令行中定义的特性,例如变量和别名作用域为当前shell生命期;那么配置文件定义的特性只对以后新启动的shell都有效。
修改配置文件,立即对当前shell生效
1、通过命令行重新定义一次
2、让shell重新读取配置文件
~] source /PATH/FROM/CONF_FILE
~] . /PATH/FROM/CONF_FILE
按登录类型分:
■ profile类:为交互式登录的shell提供配置
交互式登录:
1、直接通过某终端输入账号密码登录后打开的shell进程
2、使用su命令:su – USERNAME或 su -l USERNAME 执行的登陆切换。
功用:
1、用于定义环境变量
2、运行命令或脚本
作用范围:
1、全局:对所有用户都生效;
/etc/profile
/etc/profile.d/*.sh
2、用户个人:对当前用户有效
~/.bash_profile
■ bashrc类:为非交互式登录的shell进程提供配置
非交互式登录:
1、su USERNAME执行的命令切换
2、图形界面下打开的终端
3、运行脚本
功用:
1、定义本地变量
2、定义命令别名
作用范围:
1、全局
/etc/bashrc
用户个人:
~/.bashrc
注意:只有管理员可以修改全局配置
交互式登录shell进程加载配置文件的过程:
/etc/profile –> /etc/profile.d/* –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc
非交互式登录shell进程加载配置文件的过程:
~/.bashrc –> /etc/bashrc –> /etc/profile.d/*
原创文章,作者:小江,如若转载,请注明出处:http://www.178linux.com/38876