shell配置文件读取顺序
shell登录进程分两种类型:
- 1.交互式登录shell进程:
- 直接通过某终端登录的shell进程,如通过CRT终端登录
- 使用su - USERNAME命令登录的shell进程
- 2.非交互式登录shell进程:
- 使用su USERNAME命令登录的shell进程(注意这里没有 -)
- 运行脚本启动的shell进程
shell配置文件读取顺序
系统中存在一些shell配置文件,当shell进程启动时,会按规定的顺序读取这些文件的配置数据。但
对于上面说到的“交互式登录shell进程”和“非交互式登录shell进程”读取配置文件的顺序是有区别的,
具体如下:
- 交互式登录shell进程读取顺序:
- /etc/profile ==> /etc/profile.d/* ==> ~/.bash_profile ==> ~/.bashrc ==> /etc/bashrc
- 非交互式登录shell进程读取顺序:
- ~/.bashrc ==> /etc/bashrc ==> /etc/profile.d/*
/etc/profile配置文件:对全局生效
1 # /etc/profile
2
3 # System wide environment and startup programs, for login setup
4 # Functions and aliases go in /etc/bashrc
5
6 # It's NOT a good idea to change this file unless you know what you
7 # are doing. It's much better to create a custom.sh shell script in
8 # /etc/profile.d/ to make custom changes to your environment, as this
9 # will prevent the need for merging in future updates.
不建议修改/etc/profile文件,以.sh脚本的命令格式把个性化定制配置文件放在
/etc/profile.d/目录下是更好的选择
/etc/profile.d/*.sh配置文件:对全局生效
shell登录进程会读取/etc/profile.d/目录下所有*.sh脚本文件,我们可以把自己个性化定制的配置文件
以.sh的命名格式放在此目录下。如下,在/etc/profile.d/目录下放了一个env.sh个性化定制提示符颜色
高亮的配置文件,可以看到提示符颜色高亮效果已生效。
~/.bash_profile配置文件:用户家目录下的文件,不存在的话可以自行创建,仅对当前用户生效
1 # .bash_profile
2
3 # Get the aliases and functions
4 if [ -f ~/.bashrc ]; then #这里判断是否存在~/.bashrc文件,如果存在则执行,
5 . ~/.bashrc #使其生效。这里也可以理解上面提到的读取顺序
6 fi
7
8 # User specific environment and startup programs
9
10 PATH=$PATH:$HOME/bin #把家目录下的~/bin目录加到环境变量中
11
12 export PATH #输出环境变量
~/.bashrc配置文件:用户家目录下的文件,不存在的话可以自行创建,仅对当前用户生效
1 # .bashrc
2
3 # User specific aliases and functions
4
5 alias rm='rm -i' #定义命令别名,只对当前用户生效
6 alias cp='cp -i'
7 alias mv='mv -i'
8 alias vi='vim'
9 alias grep='grep --color'
10 alias egrep='egrep --color'
11
12
13 # Source global definitions
14 if [ -f /etc/bashrc ]; then #判断是否存在/etc/bashrc文件,如果存在,则
15 . /etc/bashrc #执行,使其生效
16 fi
/etc/bashrc配置文件:对全局生效
1 # /etc/bashrc
2
3 # System wide functions and aliases
4 # Environment stuff goes in /etc/profile
5
6 # It's NOT a good idea to change this file unless you know what you
7 # are doing. It's much better to create a custom.sh shell script in
8 # /etc/profile.d/ to make custom changes to your environment, as this
9 # will prevent the need for merging in future updates.
不建议修改/etc/bashrc文件,以.sh脚本的命令格式把个性化定制配置文件放在
/etc/profile.d/目录下是更好的选择
注意:配置文件修改后,只对随后启动的shell登录进程生效,如要立即生效,则需重新载入配置文件如下:
- source /etc/bashrc
- ./etc/bashrc
****************************************************************************************************************
正则表达式:
- 基本正则表达式:
- 字符匹配:
- .:匹配任意单个字符
- []:匹配范围内的任意单个字符
- [^]:匹配范围外的任意单个字符 ex:[^[:digit:]]:匹配非数字任意单个字符
- 匹配次数:(贪婪匹配模式)
- *:匹配前面字符任意次:0,1,多次
- .*:匹配任意长度任意字符
- \?:匹配前面字符0次或1次
- \+:匹配前面字符1次或多次
- \{m\}:匹配前面字符m次
- \{n,m\}:匹配前面字符至少n次,至多m次
- 位置锚定:
- ^:行首位置锚定
- $:行尾位置锚定 ex: ^[[:space:]]*$:匹配空白行
- \<和\b:词首位置锚定 单词:由非特殊字符组成的连续字符串称为单词
- \>和\b:词尾位置锚定
- \<PATTERN\>:完整匹配单词
- 分组和引用:
- \(\):把括号内的内容当作一个整体进行处理,分组匹配到的结果会被正则表达式引擎自动
- 记录于内部的变量中,这些变量依次为\1,\2,\3等。
- 向后引用:引用前面分组括号内匹配到的结果 \1,\2,\3,例子如下:
- \(\):把括号内的内容当作一个整体进行处理,分组匹配到的结果会被正则表达式引擎自动
- 字符匹配:
- 扩展正则表达式:
- grep -E 等价于 egrep:支持扩展正则表达式
- 字符匹配:
- .:匹配任意单个字符
- []:匹配范围内的任意单个字符
- [^]:匹配范围外的任意单个字符 ex:[^[:digit:]]:匹配非数字任意单个字符
- 匹配次数:(贪婪匹配模式)
- *:匹配前面字符任意次:0,1,多次
- .*:匹配任意长度任意字符
- ?:匹配前面字符0次或1次 #注意和基本正则表达式的区别是没有了‘\’
- +:匹配前面字符1次或多次
- {m}:匹配前面字符m次
- {n,m}:匹配前面字符至少n次,至多m次
- 位置锚定:
- ^:行首位置锚定
- $:行尾位置锚定 ex: ^[[:space:]]*$:匹配空白行
- \<和\b:词首位置锚定 单词:由非特殊字符组成的连续字符串称为单词
- \>和\b:词尾位置锚定
- \<PATTERN\>:完整匹配单词
- 分组和引用: #注意和基本正则表达式的区别是没有了‘\’
- ():把括号内的内容当作一个整体进行处理,分组匹配到的结果会被正则表达式引擎自动
- 记录于内部的变量中,这些变量依次为\1,\2,\3等。
- 向后引用:引用前面分组括号内匹配到的结果\1,\2,\3
- ():把括号内的内容当作一个整体进行处理,分组匹配到的结果会被正则表达式引擎自动
- 或运算:
- a|b:a或b
- F|file:F或者file
- (F|f)ile:File或者file
正则表达式应用:
显示/etc/passwd文件中不以/bin/bash结尾的行
NAME
grep, egrep, fgrep - print lines matching a pattern
-v, --invert-match #对结果取反
Invert the sense of matching, to select non-matching lines.
(-v is specified by POSIX.)
显示/etc/passwd含有2位数或者3位数的行:
显示/proc/meminfo文件中已S或者s开头的行:
用正则表达式实现dirname /etc/passwd的效果
-w, --word-regexp
Select only those lines containing matches that form whole
words. The test is that the matching substring must either
be at the beginning of the line, or preceded by a non-word
constituent character. Similarly, it must be either at the
end of the line or followed by a non-word constituent
character. Word-constituent characters are letters, digits,
and the underscore.
匹配ifconfig中的ip地址:
分析:IPv4格式如 X.X.X.X ,X的范围是0-255,把0-255这个范围拆分并用正则表达式表示如下:
0-9:[0-9]
10-99:[1-9][0-9]
100-199:1[0-9][0-9]
200-249:2[0-4][0-9]
250-255:25[0-5]
[0-9]和[1-9][0-9]可以合并为[1-9]?[0-9],0-255整个范围可匹配为:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]
IPv4 X.X.X.X可拆分成(X.){3}X,用正则表达式匹配为:
((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])
****************************************************************************************************************
vim配置文件:
- /etc/vimrc:对全局生效
- ~/.vimrc:仅对当前用户生效
在/etc/vimrc文件最后加上如下设置,使其tab键为4个字符,且自动缩进4个字符
****************************************************************************************************************
|| 和 &&短路运算:
COMMAND1 || COMMAND2:COMMAND1执行不成功时才执行COMMAND2
COMMAND1 && COMMAND2:COMMAND1执行成功时才执行COMMAND2
脚本实现当用户不存在时,新建三个用户test1,test2,test3,并计算三个用户的ID值之和
1 #!/bin/bash
2 #
3 #
4
5 id test1 &> /dev/null || useradd test1 #运用||短路运算实现只有用户不存在时才新建用户
6 id test2 &> /dev/null || useradd test2
7 id test3 &> /dev/null || useradd test3
8
9 UID1=$(id -u test1) #()括号里命令执行,$是取括号里的执行结果
10 UID2=$(id -u test2)
11 UID3=$(id -u test3)
12
13 UID_SUM=$[UID1+UID2+UID3] #[]方括号是算术运算
14 echo "the three user id sum is: $UID_SUM"
****************************************************************************************************************
find命令常用选项:
NAME
find - search for files in a directory hierarchy
-maxdepth levels #最大搜索层级
-mindepth levels #最小搜索层级
-name pattern #根据文件名查找
-iname pattern #忽略大小写根据文件名查找
-type c #根据文件类型查找,如f:普通文件,l:链接文件,d:目录文件等
-size n[cwbkMG] #根据文件大小查找
如:-size +5M:查找大于5M的文件; -size -5M:查找小于5M的文件。
-perm mode #根据文件权限查找,精确匹配
-perm -mode #根据文件权限查找,u,g,o每类用户每一位权限都符合条件时才满足
-perm /mode #根据文件权限查找,u,g,o每类用户任意一位权限符合条件时就满足
-nouser #查找没有属主的文件
-nogroup #查找没有属组的文件
-user uname #查找属于指定属主的文件
-group gname #查找属于指定属组的文件
-mtime n #以"天"为单位时间查找 +n:大于n天; -n:小于n天
-atime n
-ctime n
-mmin n #以"分钟"为单位时间查找 +n:大于n分钟; -n:小于n分钟
-amin n
-cmin n
- 组合测试:
- 与:-a
- 或:-o
- 非:-not, !
- 查找到的结果处理动作:
- -delete:对查找到的结果做删除操作
- -ok COMMAND {} \; :对查找到的结果执行COMMAND命令操作,且每次都得用户确认
- -exec COMMAND {} \; :对查找到的结果执行COMMAND命令操作。
- | xargs COMMAND :通过管道把查询结果传给COMMAND命令执行
查找当前目录下,属主u和属组g都没有可写w权限,但其他用户有可写2权限的文件: