Linux相识相知bash的基础特性
Posted follow your heart.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux相识相知bash的基础特性相关的知识,希望对你有一定的参考价值。
命令历史
shell进程会记录用户提交执行过的命令
可以是用history查看:
[root@localhost dev]# history 1 ss -tnl 2 ifconfig 3 vi /etc/sysconfig/network-scripts/ifcfg-ens33 4 reboot 5 systemctl stop firewalld 6 systemctl disable firewalld 7 ifconfig 8 ifconfig 9 startx 10 ping 114.114.114.114 11 top ...... 140 who -b 141 who -r 142 date 143 w 144 history
定制history的功能
HISTSIZE:shell进程可以保留的命令历史的条数
[root@localhost dev]# echo $HISTSIZE 1000
HISTFILE:持久保存命令历史的文件,当退出登录的时候,此次的命令历史才会被写入到HISTFILE中
[root@localhost dev]# echo $HISTFILE /root/.bash_history
[root@localhost dev]# cat /root/.bash_history ss -tnl ifconfig vi /etc/sysconfig/network-scripts/ifcfg-ens33 reboot systemctl stop firewalld systemctl disable firewalld ifconfig ifconfig startx ping 114.114.114.114 top ifconfig ifconfig --help type ls type ifconfig ...... bash export name echo $name bash
HISTFILESIZE:命令历史文件的大小
[root@localhost dev]# echo $HISTFILESIZE 1000
history常用命令用法
-c:清空命令历史
-d offset:删除指定命令历史,offset为指定的行数
-r:从文件读取命令历史至历史列表中
-w:把历史列表中的命令追加至历史文件中
history #:显示最近的#条命令
调用命令历史列表中的命令
!#:再次执行历史列表中第#条命令
!!:再一次执行上一条命令
!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令
调用上一条命令的最后一个参数
快捷键:按一下ESC再按点.
或者使用字符串:!$
控制命令的记录方式
[root@localhost /]# echo $HISTCONTROL ignoredups
ignoredups:忽略重复的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两者同时生效;
补全功能
命令补全
shell程序在接受到用户执行命令的请求时,最左侧的字符串会被当做命令
命令查找机制:首先查找内部命令,根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名
[root@localhost /]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
使用Tab键补全
路径补全
在给定的起始路径下,以对应路径下的打头字符串来逐一匹配起始路径下每个文件
目录管理类命令
mkdir
make directories 创建目录
mkdir [OPTION]... DIRECTORY...
常用选项:
-p:自动按需创建父目录
[root@localhost tmp]# mkdir -p /tmp/x/y/z [root@localhost tmp]# cd /tmp/x/y/z/ [root@localhost z]#
-v:显示详细过程,verbose
[root@localhost z]# mkdir -pv /tmp/a/b/c mkdir: created directory ‘/tmp/a’ mkdir: created directory ‘/tmp/a/b’ mkdir: created directory ‘/tmp/a/b/c’
-m MODE:直接给定权限
注意:路径基名方为命令的作用对象,基名之前的路径必须得存在
rmdir
remove empty direcories
移除空目录
常用选项:
-p:删除某目录后,如果其父目录为空,则一并删除之
-v:显示过程
[root@localhost b]# rmdir -pv /tmp/a/b/c/ rmdir: removing directory, ‘/tmp/a/b/c/’ rmdir: removing directory, ‘/tmp/a/b’ rmdir: removing directory, ‘/tmp/a’ rmdir: removing directory, ‘/tmp’ rmdir: failed to remove directory ‘/tmp’: Device or resource busy
命令行展开
{}:可承载一个以逗号分隔的路径,并能够将其展开为多个路径
例如:/tmp/{a,b}相当于 /tmp/a /tmp/b
例子:
如何创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b?
[root@localhost tmp]# mkdir -p /tmp/x/{y1/{a,b},y2}
如何创建a_c, a_d, b_c, b_d?
[root@localhost tmp]# mkdir -p /tmp/{a,b}_{c,d}
如何创建如下目录结构:
/tmp/mysysroot/ |-- bin |-- etc | `-- sysconfig | `-- network-scripts |-- sbin |-- usr | |-- bin | |-- lib | |-- lib64 | |-- local | | |-- bin | | |-- etc | | |-- lib | | `-- sbin | `-- sbin `-- var |-- cache |-- log `-- run
mkdir -p /tmp/mysysroot/{bin,etc/sysconfig/networkscripts,sbin,usr/{bin,lib,lib64,local/{bin,etc,lib,sbin},sbin},var/{cache,log,run}}
tree
可使用tree来查看目录的层级结构
-L #,指定要显示的层级
命令的执行状态结果
bash通过状态返回值来输出此结果:
成功:0
失败:1-255
命令执行完成之后,其状态返回值保存于bash的特殊变量$?中
[root@localhost tmp]# ls /tmp/x/ y1 y2 [root@localhost tmp]# echo $? 0 [root@localhost tmp]# ls /tmp/y ls: cannot access /tmp/y: No such file or directory [root@localhost tmp]# echo $? 2
引用
引用命令的执行结果:
$(COMMAND)或者`COMMAND`
强引用,单引号:
[root@localhost ~]# echo \'$PATH\' $PATH
弱引用,双引号:
[root@localhost ~]# echo "$PATH" /usr/local/sbin:/usr/loca
快捷键
ctrl+a:跳转至命令行行首
ctrl+e:跳转至命令行行尾
ctrl+u:删除行首至光标所在处之间的所有字符
ctrl+k:删除光标所在处至行尾的所有字符
ctrl+l:清屏,相当于clear
文件查看类命令
cat
cat [OPTION]... [FILE]...
查看文件内容,直接显示到文件底部
常用选项:
-n:可以显示行数
[root@localhost tmp]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ...... gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
tac
tac [OPTION]... [FILE]...
反向查看文件内容
[root@localhost tmp]# tac /etc/passwd tcpdump:x:72:72::/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin ...... adm:x:3:4:adm:/var/adm:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin root:x:0:0:root:/root:/bin/bash
more
分屏查看文件内容
head
head [OPTION]... [FILE]...
查看文件的前n行,默认为前10行
[root@localhost tmp]# head /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
tail
查看文件的后n行
tail [OPTION]... [FILE]...
[root@localhost tmp]# tail /etc/passwd colord:x:992:987:User for colord:/var/lib/colord:/sbin/nologin qemu:x:107:107:qemu user:/:/sbin/nologin setroubleshoot:x:991:986::/var/lib/setroubleshoot:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin sssd:x:990:985:User for sssd:/:/sbin/nologin gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
常用选项:
tail -n #:显示最后#行或者是tail -#
-f:查看文件尾部内容,结束后不退出,跟随显示新增的行
stat
display file or file system status
文件:两类数据
元数据:metadata,文件的状态,创建时间,修改时间,大小,权限等
数据:文件里面的内容
[root@localhost tmp]# stat /etc/passwd File: ‘/etc/passwd’ Size: 2235 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 19840519 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:passwd_file_t:s0 Access: 2017-07-06 09:25:43.555083116 -0400 Modify: 2017-07-01 08:00:52.140151303 -0400 Change: 2017-07-01 08:00:52.141154779 -0400 Birth: -
stat显示的就是文件的元数据,包含文件路径,大小,blocks数目,IO block,文件类型,inode号,权限,uid,gid和三个时间戳等
三个时间戳:
access:最近一次访问的时间
modify:最近一次修改文件的时间
change:文件最近一次改变的时间,即改变元数据的时间
touch
change file timestamps 修改时间戳
touch [OPTION]... FILE...
文件不存在则创建文件,当直接使用命令去touch一个文件的时候,修改的是所有的时间戳
常用选项:
-c:指定的文件路径不存在时不予以创建
-a:仅修改access time
-m:仅修改modify time
-t STAMP
[[CC]YY]MMDDhhmm[.ss]
(不能修改change time,只当元数据发生变化时,才会改变)
[root@localhost tmp]# touch -t 201212121200.30 test.txt -m [root@localhost tmp]# stat test.txt File: ‘test.txt’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 17251556 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:user_tmp_t:s0 Access: 2017-07-07 03:17:12.640883844 -0400 Modify: 2012-12-12 12:00:30.000000000 -0500 Change: 2017-07-07 03:19:17.667997201 -0400 Birth: - [root@localhost tmp]#
wc
NAME:输出文件中的行数、单词数、字节数
SYNOPSIS:wc [选项列表]... [文件名列表]...
常用选项:
-l:输出行数
-w:输出单词数,重复单词只算一个
-c:输出字节数
举例:
[root@localhost tmp]# wc /etc/passwd 40 78 2022 /etc/passwd
cut
NAME:在文件的每一行中提取片段
SYNOPSIS:cut OPTION... [FILE]...
常用选项:-d CHAR:以指定的字符为分隔符
-f FIELDS:挑选出的字段
#:指定的单个片段
#-#:连续的多个字段
#,#:离散的多个字段
举个例子
[root@localhost tmp]# cut -d: -f1 /etc/passwd root bin daemon adm lp sync shutdown halt .... frank Frank centos
sort
NAME:对文本文件的行排序
SYNOPSIS:sort [OPTION]... [FILE]...
常用选项:
-n:基于数值大小而非字符进行排序
-t CHAR:指定分隔符
-k #:用于排序比较的字段
-r:逆序排序
-f:忽略字符大小写
-u:重复行只保留一份,连续且相同
举例:以:为分隔符,按第三个字段的数值大小比较排序文件/etc/passwd下的内容
[root@localhost tmp]# sort -n -t: -k 3 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt .... polkitd:x:998:997:User for polkitd:/:/sbin/nologin systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin frank:x:1000:1000:frank:/home/frank:/bin/bash Frank:x:1001:1001::/home/Frank:/bin/bash centos:x:1002:1002::/home/centos:/bin/bash nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
uniq
NAME:删除排序文件中的重复行
SYNOPSIS:uniq [OPTION]... [INPUT [OUTPUT]]
常用选项:
-c:显示每行的重复次数
-u:仅显示未曾重复的行
-d:仅显示重复过的行
文件管理工具
cp
复制文件或者目录
单源复制:
cp [OPTION]... [-T] SOURCE DEST
如果DEST不存在,则先创建此文件,并复制源文件的数据流至DEST文件中
如果DEST存在:
如果DEST是非目录文件,则覆盖DEST文件
如果DEST是目录文件,则在DEST目录下创建一个与源文件同名的文件,并复制其数据
多源复制:
如果DIRECTORY不存在,则报错
如果DIRECTORY存在:
如果DIRECTORY是非目录文件,则报错
如果DIRECTORY是目录文件,分别复制每个文件至目标目录中,并保持原名
常用选项:
-i:交互式复制
-f:强制覆盖目标文件
-r,-R:递归复制目录
-d:复制符号链接文件本身,而非指向的源文件
-a:-dR --preserve=all, archive,用于实现归档;
--preserv=
mode:权限
ownership:属主和属组
timestamps: 时间戳
context:安全标签
xattr:扩展属性
links:符号链接
all:上述所有属性
mv
move
移动文件,可用来重命名文件
常用选项:
-i:交互式
-f:强制覆盖文件
rm
remove
移除文件
rm [OPTION]... FILE...
常用选项:
-i:交互式移除文件
-f:强制删除文件
-r:递归删除
注意:所有不用的文件建议不要直接删除,可以移动至某个专用的目录(用来做回收站的目录)
diff
NAME:找出2个文件中的不同
SYNOPSISI:diff [OPTION]... FILES
-u:使用unfied机制,即显示要修改行的上下文,默认为3行
很好用的工具
比如说我们现在有2个文件a.txt,b.txt
[root@localhost tmp]# cat a.txt 111 222 333 444 555 666 [root@localhost tmp]# cat b.txt 111 222 333
文本比较,会指出不同的行
[root@localhost tmp]# diff a.txt b.txt 4,5d3 < 444 < 555
我们可以把不同的行的信息保存到一个文件中(后面使用)
[root@localhost tmp]# diff a.txt b.txt > c.txt [root@localhost tmp]# cat c.txt 4,5d3 < 444 < 555
NAME:向文件中打补丁
SYNOPSIS:patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE
如上个例子中,b.txt比a.txt少的内容保存在了补丁文件c.txt中,我们就可以使用patch来讲b比a少的内容补进去
[root@localhost tmp]# patch b.txt c.txt patching file b.txt Reversed (or previously applied) patch detected! Assume -R? [n] yes [root@localhost tmp]# cat b.txt 111 222 333 444 555 666
Globbing
文件名通配:是对整体文件名匹配,不是部分匹配
匹配字符:
*:匹配任意长度的任意字符
?:匹配任意单个字符
[ ]:匹配指定范围内的任意单个字符‘
[a-z],[A-Z],[0-9],[a-z0-9] 不区分大小写
特殊格式:
[[:upper:]]:所有大写字母
[[:lower:]]:所有小写字母
[[:alpha:]]:所有字母
[[:digit:]]:所有数字
[[:alnum:]]:所有的字母和数字
[[:space:]]:所有空白字符
[[:punct:]]:所有标点符号
[^]:中括号加托字符,匹配指定范围外的任意单个字符
[^0-9]:匹配数字之外的任意单个字符
[^[:upper:]]:匹配大写字母以外的任意单个字符
练习:显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录;
ls -d /var/l?[[:lower:]]
练习:复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下;
cp -r /etc/[mnrp]*.conf /tmp/conf.d/
IO重定向及管道
IO即输入和输出设备,可用于输入的设备一般有键盘、文件系统上的常规文件、网卡等,可用于输出的设备有显示器、文件系统上的常规文件、网卡等;
程序的三种数据流:
输入的数据流:标准输入(stdin),键盘;
输出的数据流:标准输出(stdout),显示器;
错误的输出流:错误输出(stderr),显示器;
文件描述符:fd,file descriptor
标准输入:0
标准输出:1
错误输出:2
IO重定向
输出重定向:
> 覆盖输出
>> 追加输出
小特性:
set -C:禁止覆盖输出重定向至已存在的文件
set +C:开启覆盖输出重定向至已存在的文件(默认)
错误输出重定向:
2> 覆盖输出
2>> 追加输出
合并正常输出流和错误输出流
1.
&> 覆盖输出
&>> 追加输出
2.
COMMADN > /PATH/TO/somefile 2>&1 :如果命令执行成功则覆盖输出至somefile,执行不成功也覆盖输出至somefile
COMMAND >> /PATH/TO/somefile 2>&1:如果命令执行成功则追加覆盖至somefile,执行不成功也追加输出至somefile
注意:特殊设备:/dev/null 当不需要命令的执行结果,只需要知道命令的执行状态,则可以重定向至/dev/null,/dev/null相当于一个垃圾桶。
输入重定向:<
Here Document:<<,可以作为指定文件的结束符,常用于shell编程
[root@localhost tmp]# cat <<EOF > how are you > my name is Frank > EOF how are you my name is Frank
tr
tr [OPTION]... SET1 [SET2]
把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符,不修改原文件
用法1: tr SET SET2 < /PATH/FROM/SOMEFILE
用法2:tr -d SET1 < /PATH/FROM/SOMEFILE 删除SET1中的字符,区分大小写
管道
连接程序,实现将前面一个命令的输出直接定向后一个程序当做输出数据流
COMMAND1 | COMMAND2 | COMMAND3 ...
[root@localhost tmp]# echo \'abcd\' | tr \'a-z\' \'A-Z\' | tr -d \'AD\' BC
显示程序的输出并将其复制到一个或多个文件中
[root@localhost tmp]# echo \'abcd\' | tee /etc/fstab | tr \'ab\' \'AB\' ABcd [root@localhost tmp]# cat /etc/fstab abcd
如上例子,使用tee命令输出到/etc/fstab,又将标准输入作为了后面tr的输入。
命令hash
当在bash下面执行一个命令的时候,bash会在PATH路径下去匹配相应的命令,如果你登录一次shell,执行了多次ls,bash每次都是去PATH路径下去找一次,岂不是很耗时间和资源吗?所以当你在登录shell之后,执行的每命令都会被缓存起来,这样你下次执行同一个命令的时候,就不需要又在PATH的路径下去寻找了,只需要在缓存里去找。当然这里的命令只针对外部命令,像cd这种内建在bash程序中的命令是不需要缓存的了。
可以是hash查看当前shell进行缓存的命令(hash本身不会被缓存):
常用选项:
hash -d COMMAND:删除COMMAND
hash -r:清空hash缓存
变量
什么是变量呢?变量就可以看成存储数据的容器。
在bash变量的赋值和其他编程语言一样,使用:
name=value
[root@localhost /]# my_name="Frank" [root@localhost /]# echo ${my_name} Frank
[root@localhost /]# my_name="Frank" [root@localhost /]# echo ${my_name} Frank [root@localhost /]# echo $my_name Frank
变量名的定义规则
1.变量名只能包含字母数字下划线,不能以数字开头
2.不能够使用程序保留的关键字,如if,else
3.变量名应该既简单和具有描述性
bash变量类型
本地变量:作用域仅为当前的shell
变量赋值:name=value
查看变量:set
撤销变量:unset name
环境变量:作用域为当前shell及其子进程
变量赋值:
(1) export name=value 或者 name=value 再export name
(2) declare -x name=value 或者 name=value 再 declare -x name
查看环境变量:export,declare -x ,printenv,env
撤销环境变量:unset name
在bash中内置了很多的环境变量,环境变量一般为大写,一般用于定义bash的工作环境,如PATH,HISTSIZE
局部变量:作用域仅为某代码片段(函数上下文)
位置参数变量:当执行脚本的shell进程传递的参数
特殊变量:shell内置的有特殊功能的变量
特殊变量如$?,返回上次命令执行的状态,0代表成功,1-255代表失败
设置只读变量:
declare -r name 或者 readonly name
[root@localhost /]# name="Frank2" [root@localhost /]# [root@localhost /]# declare -r name [root@localhost /]# echo ${name} Frank2
只读变量无法被重新赋值,也不支持撤销,存活时间为当前shell进程的生命周期,随shell进行结束而终结
多命令执行
bash一行可以同时执行多个命令
~]# COMMAND1; COMMAND2; COMMAND3; ......
[root@localhost /]# useradd frank1; useradd frank2 [root@localhost /]# tail -2 /etc/passwd frank1:x:1203:1203::/home/frank1:/bin/bash frank2:x:1204:1204::/home/frank2:/bin/bash
逻辑运算
运算数:真(true,yes,on,1),假(false,no,off,0)
运算符:
与: 1 && 1 = 1 1 && 0 = 0 0 && 1 = 0 0 && 0 = 0
或: 1 || 1 = 1 1 || 0 = 1 0 || 1 = 1 0 || 0 = 0
非:! 1 = 0 ! 0 = 1
由路径运算,在bash中一个法则,为短路法则
~]#COMMAND1 && COMMAND2
如果COMMNAD1为假,那么COMMAND2就不会执行了
如果COMMAND1为真,那么COMMAND2必须执行
~]#COMMAND1 || COMMAND2
如果COMMAND1为假,那么COMMAND2必须执行
如果COMMAND2为真,那么COMMAND2不会执行
举例:
判断frank3是否存在,如果不存在则创建
[root@localhost /]# id frank3 || useradd frank3 id: frank3: no such user [root@localhost /]# tail -1 /etc/passwd frank3:x:1205:1205::/home/frank3:/bin/bash
算术运算
在bash中也可以执行算术运算:
算术运算符:
+:加
-:减
*:乘
/:除
**:幂运算
%:取余
算术运算格式:
(1) let VAR=算术运算表达式
[root@localhost ~]# let var=1+2 [root@localhost ~]# echo ${var} 3
(2) VAR=$[算术运算表达式]
[root@localhost ~]# number1=2 [root@localhost ~]# number2=2 [root@localhost ~]# var=$[$number1+$number2] [root@localhost ~]# echo ${var} 4
(3) VAR=$((算术运算表达式))
[root@localhost ~]# number1=1 [root@localhost ~]# number2=6 [root@localhost ~]# var=$(($number1+number2)) [root@localhost ~]# echo $var 7
(4)VAR=$(expr $ARG1 操作 $ARG2)
[root@localhost ~]# number2=6 [root@localhost ~]# number1=1 [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# var=$(expr $number1 + $number2) [root@localhost ~]# echo $var 7
expr也可以做数值比较,详见man expr
[root@localhost ~]# var=$(expr $number1 = $number2) [root@localhost ~]# echo $var 0
bash的配置文件
当我们登录shell进程的时候,会读取bash的配置文件,bash的配置文件非为两种,profile类和bashrc类,在讲这个之前,只有管理员才能修改bash的配置文件,我们先来了解一下下面两种登录类型:
交互式登录shell进程:
1.通过某终端输入账号和密码后登录打开的shell进程
2.使用su命令,su - USERNAME或者使用su -l USERNAME登录shell进程
非交互式登录shell基础:
1.图形界面下打开的终端
2.运行脚本时打开的shell
3.su USERNAME执行的登录切换
了解两种登录类型的时候,我们就来看看bash的两类配置文件,profile类和bashrc类
profile类:
profile类的文件有:/etc/profile /etc/profile.d/*.sh ~/.bash.profile
全局作用:/etc/profile和/etc/profile.d/*.sh
用户个人作用:~/.bash.rc
主要作用:用于定义环境变量,运行命令或脚本
bashrc类:
bashrc类的文件有:/etc/bashrc ~/.bashrc
全局作用:/etc/bashrc
用户个人作用:~/.bashrc
主要作用:定义本地变量和命令的别名
那么两种登录方式会读取哪些配置文件,读取时是按怎样的顺序呢?
交互式登录shell进程:
/etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录shell进程:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*
在前面命令行中定义变量的时候,我们会发现当我关闭shell进程的时候,再次登录的时候,之前定义的变量都没有了,所以在命令行中定义的变量的生命周期为当前shell进程的生命周期。
如果在配置文件中定义,会出现什么样的情况呢?我们来试试,前面说bashrc是主要定义命令别名的,命令别名在~/.bashrc中存在:
[root@localhost ~]# cat .bashrc # .bashrc # User specific aliases and functions alias rm=\'rm -i\' alias cp=\'cp -i\' alias mv=\'mv -i\' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi
好的,我们就在文件写入alias cls=\'clear\',写完之后保存退出,执行cls,我们会发现并没有成功,因为在配置文件中写入的只对随后新启动的shell进程有效
让配置文件定义的特性立即生效的方法
1.通过命令行重复定义一次
2.让shell进程重读配置文件
~]#source /PATH/FROM/CONFI_FILE
或者
~]# . /PATH/FROM/CONFI_FILE
举个例子:让centos用户登录时,显示欢迎,并显示当前时间:
分析:因为只是针对单个用户,我们只需要在其家目录下修改.bash_profiel文件
echo "Hi centos!" echo `date`
当用户登录时就会显示效果:
更新历史:
2017-7-18:更新了命令wc、sort、uniq、cut、diff和patch
更新命令hash、变量、多命令执行,逻辑和算术运算和bash的配置文件
以上是关于Linux相识相知bash的基础特性的主要内容,如果未能解决你的问题,请参考以下文章