命令历史

shell进程会记录用户提交执行过的命令

可以是用history查看:

[root@localhost dev]# 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
......
who -b
who -r
date
w
history

定制history的功能

HISTSIZE:shell进程可以保留的命令历史的条数

[root@localhost dev]# echo $HISTSIZE

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

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 $? [root@localhost tmp]# ls /tmp/y
ls: cannot access /tmp/y: No such file or directory
[root@localhost tmp]# echo $?

引用

引用命令的执行结果:

$(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:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
......
gnome-initial-setup:x::::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x::::/:/sbin/nologin

tac

tac [OPTION]... [FILE]...

反向查看文件内容

[root@localhost tmp]# tac /etc/passwd
tcpdump:x::::/:/sbin/nologin
avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
gnome-initial-setup:x::::/run/gnome-initial-setup/:/sbin/nologin
......
adm:x:::adm:/var/adm:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
bin:x:::bin:/bin:/sbin/nologin
root:x:::root:/root:/bin/bash

more

分屏查看文件内容

head

head  [OPTION]... [FILE]...

查看文件的前n行,默认为前10行

[root@localhost tmp]# head /etc/passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin
常用选项:
head -n  #:显示前#行或者是head -#

tail

查看文件的后n行

tail  [OPTION]... [FILE]...

[root@localhost tmp]# tail /etc/passwd
colord:x:::User for colord:/var/lib/colord:/sbin/nologin
qemu:x:::qemu user:/:/sbin/nologin
setroubleshoot:x::::/var/lib/setroubleshoot:/sbin/nologin
rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gdm:x::::/var/lib/gdm:/sbin/nologin
sssd:x:::User for sssd:/:/sbin/nologin
gnome-initial-setup:x::::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x::::/:/sbin/nologin

常用选项:

tail -n #:显示最后#行或者是tail -#

-f:查看文件尾部内容,结束后不退出,跟随显示新增的行

stat

display file or file system status

文件:两类数据

元数据:metadata,文件的状态,创建时间,修改时间,大小,权限等

数据:文件里面的内容

[root@localhost tmp]# stat /etc/passwd
File: ‘/etc/passwd’
Size: Blocks: IO Block: regular file
Device: fd00h/64768d Inode: Links:
Access: (/-rw-r--r--) Uid: ( / root) Gid: ( / root)
Context: system_u:object_r:passwd_file_t:s0
Access: -- ::43.555083116 -
Modify: -- ::52.140151303 -
Change: -- ::52.141154779 -
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: Blocks: IO Block: regular empty file
Device: fd00h/64768d Inode: Links:
Access: (/-rw-r--r--) Uid: ( / root) Gid: ( / root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: -- ::12.640883844 -
Modify: -- ::30.000000000 -
Change: -- ::17.667997201 -
Birth: -
[root@localhost tmp]#

wc

NAME:输出文件中的行数、单词数、字节数

SYNOPSIS:wc [选项列表]... [文件名列表]...

常用选项:

-l:输出行数

-w:输出单词数,重复单词只算一个

-c:输出字节数

举例:

[root@localhost tmp]# wc /etc/passwd
/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  /etc/passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
....
polkitd:x:::User for polkitd:/:/sbin/nologin
systemd-bus-proxy:x:::systemd Bus Proxy:/:/sbin/nologin
frank:x:::frank:/home/frank:/bin/bash
Frank:x::::/home/Frank:/bin/bash
centos:x::::/home/centos:/bin/bash
nfsnobody:x:::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目录下创建一个与源文件同名的文件,并复制其数据

多源复制:

cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

如果DIRECTORY不存在,则报错

如果DIRECTORY存在:

如果DIRECTORY是非目录文件,则报错

如果DIRECTORY是目录文件,分别复制每个文件至目标目录中,并保持原名

常用选项:

-i:交互式复制

-f:强制覆盖目标文件

-r,-R:递归复制目录

-d:复制符号链接文件本身,而非指向的源文件

-a:-dR --preserve=all, archive,用于实现归档;

--preserv=

mode:权限

ownership:属主和属组

timestamps: 时间戳

context:安全标签

xattr:扩展属性

links:符号链接

all:上述所有属性

mv

move

移动文件,可用来重命名文件

SYNOPSIS
       mv [OPTION]... [-T] SOURCE DEST
       mv [OPTION]... SOURCE... DIRECTORY
       mv [OPTION]... -t DIRECTORY SOURCE...

常用选项:
-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 

[root@localhost tmp]# cat b.txt 

文本比较,会指出不同的行

[root@localhost tmp]# diff a.txt b.txt
,5d3
<
<

我们可以把不同的行的信息保存到一个文件中(后面使用)

[root@localhost tmp]# diff a.txt b.txt  > c.txt
[root@localhost tmp]# cat c.txt
,5d3
<
<
 
patch

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

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
tee

显示程序的输出并将其复制到一个或多个文件中

[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
在bash中,变量是弱类型的,把所有的变量都看成是字符型,变量不需要事先声明,声明和赋值可以同时实现。
变量引用使用${name}或者$name,建议使用加花括号的方式
[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 - /etc/passwd
frank1:x::::/home/frank1:/bin/bash
frank2:x::::/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 - /etc/passwd
frank3:x::::/home/frank3:/bin/bash

算术运算

在bash中也可以执行算术运算:

算术运算符:

+:加

-:减

*:乘

/:除

**:幂运算

%:取余

算术运算格式:

(1) let VAR=算术运算表达式

[root@localhost ~]# let var=+
[root@localhost ~]# echo ${var}

(2) VAR=$[算术运算表达式]

[root@localhost ~]# number1=
[root@localhost ~]# number2=
[root@localhost ~]# var=$[$number1+$number2]
[root@localhost ~]# echo ${var}

(3) VAR=$((算术运算表达式))

[root@localhost ~]# number1=
[root@localhost ~]# number2=
[root@localhost ~]# var=$(($number1+number2))
[root@localhost ~]# echo $var

(4)VAR=$(expr $ARG1 操作  $ARG2)

[root@localhost ~]# number2=
[root@localhost ~]# number1=
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# var=$(expr $number1 + $number2)
[root@localhost ~]# echo $var

expr也可以做数值比较,详见man expr

[root@localhost ~]# var=$(expr $number1 = $number2)
[root@localhost ~]# echo $var

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的基础特性的更多相关文章

  1. linux学习12 bash的常见特性及文本查看命令实战

    一.回顾 1.FHS,命令及bash命令历史 a.FHS: /bin,/sbin,/lib,/lib64,/etc /home,/root /boot /media,/mnt /proc,/sys / ...

  2. 【Linux相识相知】bash的特性

    命令历史 shell进程会记录用户提交执行过的命令 可以是用history查看: [root@localhost dev]# history ss -tnl ifconfig vi /etc/sysc ...

  3. 【Linux相识相知】计算机的组成、linux发行版和哲学思想、基础命令和目录结构(FHS)

    从今天开始,Frank将开始在博客上记录自己学习linux的点点滴滴,F初来乍到,还望各位大佬多多指教.本次博客的主要内容如下: 计算机基础:简要的描述了计算机的组成及其功能: linux初识:介绍了 ...

  4. 【linux相识相知】磁盘分区及文件系统管理详解

    磁盘,提供持久的数据存储,它不像我们的内存,如果突然断电了,在内存中的数据一般都会被丢掉了,内存中的数据在保存的时候,会被写到硬盘里面,磁盘也是一种I/O设备. 我们都知道磁盘分区完成之后,还要进行格 ...

  5. 【linux相识相知】用户及权限管理

    linux系统是多用户(Multi-users)和多任务(Multi-tasks)的,这样的目的是为了一台linux主机可以给很多用户提供服务同时运行多种服务,但是我们是怎么区分每个用户呢?作为一个管 ...

  6. 【Linux相识相知】yum的配置使用和程序包的编译安装

    在上一篇博客中,写到了如何使用rpm命令来安装.卸载软件等,但是大家都知道,各个软件包之间可能存在依赖关系,如果安装某个软件需要额外的依赖其他若干的包,那么我们就需要将其他额外的包一个一个的安装上去, ...

  7. 【Linux相识相知】任务计划和周期性任务

    在我们的生活中,有的工作是例行的,例如每年一次加薪.每年给女朋友过一次生日.每天上班都要打卡等,有的工作是临时发生的,例如明天朋友要来访,你需要准备午餐等等. 像很多例行的工作,你一旦忙起来就很容易忘 ...

  8. 【linux相识相知】VIM编辑器

    Vim是一个类似Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了许多的功能,VIM是自由软件,今天我们就来讲讲VIM的使用方法. 本文是基于centos7上的vim编辑器演示的 ...

  9. 【Linux相识相知】文本处理工具之grep\egrep\fgrep及正则表达式

    常说Linux上有文本处理的三剑客,grep.sed和awk,本文就grep做出详细的描述,并引出正则表达式. grep NAME:打印模式匹配的行 SYNOPISIS: grep [OPTIONS] ...

随机推荐

  1. ListView的使用(一)

    在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示. 列表的显示需要三个元素: 1.ListVeiw 用来展示列表的View. 2.适 ...

  2. Factoextra R Package: Easy Multivariate Data Analyses and Elegant Visualization

    factoextra is an R package making easy to extract and visualize the output of exploratory multivaria ...

  3. TOJ4101.Guess Game(TOJ means Tianjin University Online Judge)(dp的思想,但这道题目是假dp)

    题意:你要从[1,n]这个n个数中猜出来规定的某个数,现在这个数未知,问你在最糟糕的情况下(但是你采用了最优的策略),你要猜多少次才能猜出这个数.现在有两种条件: 第一种:当你猜的数比指定的那个数小的 ...

  4. jquery中html、text、val回调函数

    先扫盲: 摘自菜鸟教程:jQuery 方法:text().html() 以及 val()拥有回调函数. 回调函数有两个参数:被选元素列表中当前元素的下标,以及原始(旧的)值.然后以函数新值返回您希望使 ...

  5. WebSocket和kafka实现数据实时推送到前端

    一. 需求背景      最近新接触一个需求,需要将kafka中的数据实时推送到前端展示.最开始想到的是前端轮询接口数据,但是无法保证轮询的频率和消费的频率完全一致,或造成数据缺失等问题.最终确定用利 ...

  6. Selenium WebDriver + python 自动化测试框架

    目标 组内任何人都可以进行自动化测试用例的编写 完全分离测试用例和自动化测试代码,就像写手工测试用例一下,编写excel格式的测试用例,包括步骤.检查点,然后执行自动化工程,即可执行功能自动化测试用例 ...

  7. Spring学习(3)---Spring设值注入和构造注入

    (一)设值注入就是指要被注入的类中定义有一个setter()方法,并在参数中定义需要注入的对象.简单的看个例子. 建一个User类: package com.ioc; public class Use ...

  8. WPF Dashboard仪表盘控件的实现

    1.确定控件应该继承的基类 从表面上看,目前WPF自带常用控件中,没有一个是接近这个表盘控件的,但将该控件拆分就能够发现,该控件的每个子部分都是在WPF中存在的,因此我们需要将各个子控件组合才能形成这 ...

  9. Vue2 全家桶仿 微信App 项目,支持多人在线聊天和机器人聊天

    前言 这个项目是利用工作之余写的一个模仿微信app的单页面应用,整个项目包含27个页面,涉及实时群聊,机器人聊天,同学录,朋友圈等等,后续页面还是开发中.写这个项目主要目的是练习和熟悉vue和vuex ...

  10. CSS中的尺寸单位

    绝对单位 px: Pixel 像素 pt: Points 磅 pc: Picas 派卡 in: Inches 英寸 mm: Millimeter 毫米 cm: Centimeter 厘米 q: Qua ...