Linux shell基础知识(上)

目录

一、shell介绍

二、命令历史

三、命令补全和别名

四、通配符

五、输入输出重定向

六、管道符和作业控制

七、shell变量

八、环境变量配置文件

九、bashrc和bash_profile的区别

一、shell介绍

shell是一个命令解释器,提供用户和机器之间的交互。支持特定语法,如逻辑判断,循环等。每个用户都可以有自己的shell,centos7默认的shell为bash(Bourne Again Shell)。

Shell的两大家族

1.Bourne Shell家族:sh、ksh、bash

2.C-shell家族:csh、tcsh

查看系统支持的shell种类

//通过chsh命令查看
[root@lanquark ~]# chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin //通过/etc/shells文件查看
[root@lanquark ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

临时改变shell:直接运行一个新shell启动另一个shell。如需返回Bash时,按^D返回。

[root@lanquark ~]# zsh
[root@lanquark]~#

改变登录shell

[user3@lanquark ~]$ chsh -s /bin/zsh
Changing shell for user3.
Password:
Shell changed.

二、命令历史

在输入命令时,shell会将命令保存到历史列表中。

可使用方向键调用历史命令。但每次只允许查看一条命令。

history和!命令可以显示全部或者部分历史列表。

在历史列表中,每一条命令称为一个事件,而每个事件都有一个内部编号,称为事件编号。历史列表的功能就是它可以基于事件编号调取命令。

[root@lanquark ~]# history | head -n 10
1 lsblk
2 which lsblk
3 rpm -ql util-linux
4 rpm -ql util-linux | more
5 which vim
6 ping www.163.com
7 yum -y install vim dos2unix unix2dos htop
8 yum list | grep epel
9 yum -y install epel-release.noarch
10 yum repols

通过事件编号调取并执行特定命令

//!后不能有空格
[root@lanquark ~]# !2
which lsblk
/usr/bin/lsblk

执行之前输入命令中带有某些关键字的命令

[root@lanquark ~]# !lsblk
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 190M 0 part /boot
├─sda2 8:2 0 1.9G 0 part [SWAP]
└─sda3 8:3 0 14G 0 part /
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 3G 0 part
│ └─lvm_test-lvm 253:0 0 6.9G 0 lvm
├─sdb2 8:18 0 3G 0 part
│ └─lvm_test-lvm 253:0 0 6.9G 0 lvm
└─sdb3 8:19 0 3G 0 part
└─lvm_test-lvm 253:0 0 6.9G 0 lvm
sr0 11:0 1 4.2G 0 rom

执行之前输入的最后一条命令

[root@lanquark ~]# !!
which lsblk
/usr/bin/lsblk

在重新执行命令之前对命令进行小的修改

[root@lanquark ~]# !2:s/lsblk/blkid/
which blkid
/usr/sbin/blkid

当前shell的历史表保存位置

//.bash_history
[root@lanquark ~]# cat ~/.bash_history | head -n 10
lsblk which lsblk rpm -ql util-linux
rpm -ql util-linux | more
which vim
ping www.163.com
yum -y install vim dos2unix unix2dos htop
yum list | grep epel

清除内存中的history命令列表

[root@lanquark ~]# history -c
[root@lanquark ~]# history
600 history
//注意,history -c不会清除已经保存在.bash_history的历史命令列表

历史列表默认大小:

[root@lanquark ~]# echo $HISTSIZE
1000

设置历史列表大小

//当前shell有效
[root@lanquark ~]# export HISTSIZE=50
[root@lanquark ~]# echo $HISTSIZE
50
//如需永久生效,可修改/etc/profile文件
[root@lanquark ~]# grep HISTSIZE /etc/profile
HISTSIZE=1000 //修改为想要的大小
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
[root@lanquark ~]# . /etc/profile

如需历史列表记录命令执行时间,修改HISTTIMEFORMAT环境变量

//当前shell临时生效
[root@lanquark ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
[root@lanquark ~]# export HISTTIMEFORMAT
[root@lanquark ~]# echo $HISTTIMEFORMAT
%Y/%m/%d %H:%M:%S
//效果
[root@lanquark ~]# history
600 2018/06/01 06:23:01 history
601 2018/06/01 06:25:12 cat ~/.bash_history
602 2018/06/01 06:27:09 lsblk
603 2018/06/01 06:27:15 which lsblk
604 2018/06/01 06:28:54 lsblk
605 2018/06/01 06:32:24 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
606 2018/06/01 06:32:37 export HISTTIMEFORMAT
607 2018/06/01 06:32:43 echo $HISTTIMEFORMAT
608 2018/06/01 06:33:40 history
//如需永久生效,可修改/etc/profile
[root@lanquark ~]# vim /etc/profile
//添加如下条目
export HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "

永久保存历史命令列表

[root@lanquark ~]# chattr +a ~/.bash_history
//注意:如果shell没有正常退出(如直接断开终端,异常中断等),则内存中的shell历史列表不会保存

命令补全和别名

tab键敲一次与敲两次

tab:补全单词

tab tab:显示所有可能

[root@lanquark ~]# ls
anaconda-ks.cfg demo download download1
//如需查看demo目录的属性,可输入de,然后按tab,因为只有一个文件是以de开头,所以shell会自动填充该文件名的剩余部分
//如需查看download目录的属性,如输入down,然后按tab,因为有两个文件是以down开头,所以shell将发出滴滴声提示键入的内容有岐义性,有两种选择,一是键入更多的内容并再次尝试自动补全。或者如果不确定该键入的内容,可按第二次tab键,使用shell显示所有可能匹配的文件的列表。

参数补全

//Centos6中需安装bash-completion、
yum -y install bash-completion
//Centos7默认已经安装

别名就是赋予一条命令或一列命令的名称。可以将别名作为缩写,或者使用别名创建已有命令的自定义变体。

alias命令可以创建别名

语法: alias [name=commands]

//显示当前shell下已经设置的别名
[root@lanquark ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
//不用别名的效果,用反斜杠转义,匹配到的内容不显示颜色
[root@lanquark ~]# \grep hjm /etc/passwd
hjm:x:5000:5000:HJM:/home/hjm:/bin/bash
//不用别名的效果,绝对路径,匹配到的内容不显示颜色
[root@lanquark ~]# /usr/bin/grep hjm /etc/passwd
hjm:x:5000:5000:HJM:/home/hjm:/bin/bash
//ualias取消别名
[root@lanquark ~]# alias
[root@lanquark ~]# ll
-bash: ll: command not found
//别名的效果,匹配到的内容会自动显示颜色
[root@lanquark ~]# grep hjm /etc/passwd
hjm:x:5000:5000:HJM:/home/hjm:/bin/bash

临时添加别名

[root@lanquark ~]# free
total used free shared buff/cache available
Mem: 999720 135680 495472 6780 368568 677996
Swap: 1999868 0 1999868
[root@lanquark ~]# alias free='free -m'
[root@lanquark ~]# free
total used free shared buff/cache available
Mem: 976 132 483 6 359 661
Swap: 1952 0 1952

修改用户的别名配置文件~/.bashrc,永久添加别名

[root@lanquark ~]# 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 //在~/.bashrc增加alias free='free -m'
[root@lanquark ~]# vim ~/.bashrc
//重新加载配置文件
[root@lanquark ~]# . ~/.bashrc
[root@lanquark ~]# free
total used free shared buff/cache available
Mem: 976 133 482 6 359 661
Swap: 1952 0 1952

系统默认在/etc/profile.d/下通过脚本定义了一部分别名

[root@lanquark ~]# ls /etc/profile.d/
256term.csh bash_completion.sh colorgrep.sh colorls.sh lang.sh less.sh vim.sh which2.sh
256term.sh colorgrep.csh colorls.csh lang.csh less.csh vim.csh which2.csh

通配符

常用通配符

*星号,代表任意字符,0个或多个, *号不会匹配隐藏的文件。

? 问号代表任意一个字符,问号不与以句点开始的文件(隐藏文件)名匹配

[ ] 定义一个字符类,与列表中每个单独字符进行匹配

{ } 分组

通配符(wildcard),通配符的匹配是完全匹配

[root@lanquark demo]# ls
1.txt 2.txt f1.txt f2.txt temp
//*匹配0个或多个字符
[root@lanquark demo]# ls *txt
1.txt 2.txt f1.txt f2.txt txt
//?匹配一个字符
[root@lanquark demo]# ls ?.txt
1.txt 2.txt
//[]字义字符类,与列表中每个单独字符进行匹配
[root@lanquark demo]# ls [1-9].txt
1.txt 2.txt
//{}分组
[root@lanquark demo]# ls f{1,2}.txt
f1.txt f2.txt

输入输出重定向

Linux用文件描述符来标识每一个对象。文件描述符是一个整数,可以唯一标识会话中打开的文件。每个进程最多可以一次有九个文件描述符。

在命令行上,命令总是在左侧,箭头方向就是数据的流向。

标准输入(stdin):文件描述符为0,默认是键盘。使用0<或0<<。数据流向从右向左。

[root@lanquark demo]# wc -l < /etc/passwd
22

标准输出(stdout):文件描述符为1,默认是屏幕。使用1>或1。数据流向从左向右。

[root@lanquark demo]# ls -l > ls.txt
[root@lanquark demo]# cat ls.txt
total 8
-rw-r--r-- 1 root root 0 Jun 1 07:27 1.txt
-rw-r--r-- 1 root root 0 Jun 1 07:27 2.txt
-rw-r--r--. 1 root root 16 May 21 00:58 f1.txt
-rw-r--r-- 1 root root 0 May 21 19:46 f2.txt
-rw-r--r-- 1 root root 0 Jun 1 07:44 ls.txt
-rw-r--r-- 1 root root 1146 May 25 03:44 temp
-rw-r--r-- 1 root root 0 Jun 1 07:28 txt
//标准输出追加重定向>>
[root@lanquark demo]# cat 1.txt
111
[root@lanquark demo]# cat 1.txt > 2.txt
[root@lanquark demo]# cat 1.txt >> 2.txt
[root@lanquark demo]# cat 1.txt >> 2.txt
[root@lanquark demo]# cat 2.txt
111
111
111

标准错误输出(stderr): 文件描述符为2,默认是屏幕。使用2>或2>>。数据流向从左向右。

[root@lanquark demo]# ls bb.txt 2>err.txt
[root@lanquark demo]# cat err.txt
ls: cannot access bb.txt: No such file or directory

2>&1将标准错误输出和标准输出输出到同一位置。同 &>

[root@lanquark demo]# ls 1.txt a.txt > ls.txt 2>&1
[root@lanquark demo]# cat ls.txt
ls: cannot access a.txt: No such file or directory
1.txt

内联输入重定向(inline input redirection,也就是here文档)

内联输入重定向符号是<<符号,示例如下

command << marker
data
maker #是结束标志, cat >> test <<EOF
hello
how
abour
you
EOF

六、管道符和作业控制

| 管道符,将前一个命令的标准输出自动发送给下一个命令的标准输入。

[root@lanquark demo]# cat 1.txt | wc -l
20
[root@lanquark demo]# cat 1.txt | grep error
error

管道分流命令:tee 可将程序的输出同时发送到两个地方

[root@lanquark demo]# ifconfig | tee ipconfig.txt
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.1.213 netmask 255.255.255.0 broadcast 10.0.1.255
inet6 fe80::c388:e67a:4ac3:6566 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:91:d7:14 txqueuelen 1000 (Ethernet)
RX packets 2321 bytes 200994 (196.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 835 bytes 127018 (124.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 68 bytes 5900 (5.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 68 bytes 5900 (5.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@lanquark demo]# cat ipconfig.txt
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.1.213 netmask 255.255.255.0 broadcast 10.0.1.255
inet6 fe80::c388:e67a:4ac3:6566 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:91:d7:14 txqueuelen 1000 (Ethernet)
RX packets 2321 bytes 200994 (196.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 835 bytes 127018 (124.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 68 bytes 5900 (5.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 68 bytes 5900 (5.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

作业控制

ctrl+z 挂起一个任务到后台

[root@lanquark demo]# sleep 1000
^Z
[1]+ Stopped sleep 1000

jobs 查看后台任务列表

[root@lanquark demo]# jobs
[1]+ Stopped sleep 1000

bg 把任务放到后台去执行

[root@lanquark demo]# bg
[1]+ sleep 1000 &
[root@lanquark demo]# jobs
[1]+ Running sleep 1000 &

fg 把任务调到前台执行

[root@lanquark demo]# fg
sleep 1000

command & 将命令放到后台运行

[root@lanquark demo]# sleep 2000 &
[2] 1329

结束作业 kill %id(可以是进程id或作业号)

//通过作业号结束
[root@lanquark demo]# jobs
[1]+ Stopped sleep 1000
[2]- Running sleep 2000 &
[root@lanquark demo]# kill %2
[root@lanquark demo]# jobs
[1]+ Stopped sleep 1000
[2]- Terminated sleep 2000
[root@lanquark demo]# jobs
[1]+ Stopped sleep 1000
//通过进程id结束
[root@lanquark demo]# sleep 1000 &
[1] 1345
[root@lanquark demo]# kill 1345
[1]+ Terminated sleep 1000
[root@lanquark demo]# jobs
[root@lanquark demo]#

Shell变量

shell变量的类型及定义方式

变量就是为某个信息片段所起的名字,标志内存中的一段地址。

shell变量的类型

1.环境变量:用来存储有关shell会话和工作环境的信息。

常用环境变量:PATH,HOME,PWD,LOGNAME

[root@lanquark demo]# echo -e "$PATH\n$HOME\n$PWD\n$LOGNAME"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8/bin:/root/bin
/root
/root/demo
root

全局环境变量,全局可用, env(显示全部环境变量)或printenv(显示个别 如printenv HOME)查看

//env显示全部环境变量
[root@lanquark demo]# env
XDG_SESSION_ID=2
HOSTNAME=lanquark.com
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.1.229 2195 22
SSH_TTY=/dev/pts/0
JRE_HOME=/usr/local/jdk1.8/jre
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8/bin:/root/bin
PWD=/root/demo
JAVA_HOME=/usr/local/jdk1.8
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
CLASSPATH=/usr/local/jdk1.8/lib/
SSH_CONNECTION=10.0.1.229 2195 10.0.1.213 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
OLDPWD=/root //printenv显示单个环境变量值
[root@lanquark demo]# printenv HOME
/root

2.局部变量,只能在定义它的进程中可见。

3.自定义变量

变量名可以由一个字母、数字或下划线符号组成,不能以数字开头。长度不超过20个字符。变量名区分大小写,请留意:Var1 和var1不是同一个变量。

shell变量的定义方式一:variable=value

变量定义语句的等号两侧不能有空格。如var1=10,如果任意一侧有空格,shell都不会认为这是一个变量定义。

//变量的定义
[root@lanquark demo]# str='I love this game'
[root@lanquark demo]# echo $str
I love this game
//不能以数字开头
[root@lanquark demo]# 1str='aaa'
-bash: 1str=aaa: command not found
//等号两端不能有空格
[root@lanquark demo]# name= terry
-bash: terry: command not found
//变量值有特殊字符时需要引用
[root@lanquark demo]# str=I love this game
bash: love: command not found
[root@lanquark demo]# str="I love this game"
[root@lanquark demo]# echo $str
I love this game
//变量的累加,推荐用花括号{}
[root@lanquark demo]# str1='china'
[root@lanquark demo]# str1="hello "
[root@lanquark demo]# str2=${str1}world
[root@lanquark demo]# echo $str2
hello world

引用变量值的方式:在变量名前加$

[root@lanquark demo]# str='I love this game'
[root@lanquark demo]# echo $str
I love this game

shell中的变量可以不用事先定义就直接引用,如果变量没有定义过,它就相当于是一个空变量,引用这样的空变量会返回一个空的字符串而不会报错。

[root@lanquark demo]# echo $myname

[root@lanquark demo]#

设置环境变量 (export),建议按以下方式来设定全局变量

变量名=值

export 变量名

export 变量名=值

//定义方式1
[root@lanquark demo]# myname='terry'
[root@lanquark demo]# export myname
[root@lanquark demo]# echo $myname
terry
[root@lanquark demo]# bash
[root@lanquark demo]# echo $myname
terry
[root@lanquark demo]# env | grep myname
myname=terry //定义方式2
[root@lanquark demo]# export red='blue'
[root@lanquark demo]# echo $red
blue
[root@lanquark demo]# bash
[root@lanquark demo]# echo $red
blue
[root@lanquark demo]# env | grep -w red
red=blue

查看所有的变量set(环境和自定义)

BASH=/usr/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
CLASSPATH=/usr/local/jdk1.8/lib/
COLUMNS=87
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=lanquark.com
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
JAVA_HOME=/usr/local/jdk1.8
JRE_HOME=/usr/local/jdk1.8/jre
LANG=en_US.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=23
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=1266
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/root/demo
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=2
SSH_CLIENT='10.0.1.229 2195 22'
SSH_CONNECTION='10.0.1.229 2195 10.0.1.213 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=2
_=game
colors=/root/.dircolors
myname=terry
red=blue
str='I love this game'

删除环境变量 unset

[root@lanquark demo]# unset myname
[root@lanquark demo]# echo $myname [root@lanquark demo]# env | grep myname
[root@lanquark demo]#

同名的环境变量在父、子进程中是两个独立的变量,引用不同的存储空间,不能通过在子进程中修改其值来改变父进程中的变量值。

[root@lanquark demo]# export myname=terry
[root@lanquark demo]# echo $myname
terry
[root@lanquark demo]# bash
[root@lanquark demo]# export myname=via
[root@lanquark demo]# echo $myname
via
[root@lanquark demo]# exit
exit
[root@lanquark demo]# echo $myname
terry

在子shell中删除全局变量后,你无法将效果反映到父shell中,不影响父shell

[root@lanquark demo]# unset myname
[root@lanquark demo]# export myname='terry'
[root@lanquark demo]# echo $myname
terry
[root@lanquark demo]# bash
[root@lanquark demo]# unset myname
[root@lanquark demo]# echo $myname [root@lanquark demo]# exit
exit
[root@lanquark demo]# echo $myname
terry

八、环境变量配置文件

登录shell和非登录shell

登录时启动的shell称为登录shell。其他shell称为非登录shell。

登录shell要求进行登录(一般是用用户名和密码登录)。

环境变量的配置文件分为两个层面:系统层面和用户层面

/etc/profile 定义系统级的环境变量,只有登录才执行。不建议去修改该文件。

如需定义系统级的环境变量,建议在/etc/profile.d/目录下定义。

/etc/bashrc主要定义了非登录shell的环境,用户不用登录

用户层用的配置文件

~/.bashrc

定义当前用户非登录shell的环境变量

~/.bash_profile

定义当前用户登录shell的环境变量

~/.bash_history

保存当前用户的命令历史列表

~/.bash_logout

定义用户退出shell里要执行的任务

root@lanquark:~# echo Byebye >> ~/.bash_logout
root@lanquark:~# logout
Byebye
Connection closing...Socket close.

如果用户需要自定义环境变量,建立在用户层面的配置文件中修改。 建议定义在/.bashrc中,因为/.bash_profile也会调用~/.bashrc。

[root@lanquark ~]# 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

修改后需执行一下配置文件

[root@lanquark ~]# source ~/.bashrc

[root@lanquark ~]# . ~/.bashrc

PS1环境变量的定义

PS1是定义的是命令提示符,可以通过自定的方式修改PS1的样式

//默认
[root@lanquark ~]# echo $PS1
[\u@\h \W]\$
//自定义
[root@lanquark ~]# PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '
//变为绿色显示
root@lanquark:~#
//恢复为默认
root@lanquark:~# PS1='[\u@\h \W]\$'
//如需永久变更,可以写到入~/.bashrc文件中
[root@lanquark ~]#vim ~/.bashrc
//添加下行内容
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '
[root@lanquark ~]#. ~/.bashrc
invoke /root/.bashrc
root@lanquark:~#

九、bashrc和bash_profile的区别

测试环境

[root@lanquark ~]# echo 'echo invoke ~/.bashrc'>>~/.bashrc
[root@lanquark ~]# echo 'echo invoke ~/.bash_profile'>>~/.bash_profile

登录shell

终端登录

ssh远程登录

Last login: Thu May 31 22:39:05 2018 from 10.0.1.229
invoke /root/.bashrc
invoke /root/.bash_profile

su切换登录

[hjm@lanquark ~]$ su -
Password:
Last login: Thu May 31 22:41:53 EDT 2018 on tty1
invoke /root/.bashrc
invoke /root/.bash_profile
[root@lanquark ~]#

非登录shell

[root@lanquark ~]# bash
invoke /root/.bashrc

结论:

1.登录shell会执行/.bash_profile和/.bashrc里的命令

2.非登录shell只会执行~/.bashrc里的命令

3.若要配置环境变量,最好是在~/.bashrc中配置,因为不管登录shell还是非登录shell都会执行

参考:http://ask.apelearn.com/question/7719

Linux shell基础知识(上)的更多相关文章

  1. Linux Shell 基础知识(一)

    1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 ​ GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...

  2. Linux Shell 基础知识(二)

    1.本文知识结构 2.文件的查询与检索 2.1. cd 目录切换 找到文件/目录位置:cd 切换到上一个工作目录: cd - 切换到home目录: cd or cd ~ 显示当前路径: pwd 更改当 ...

  3. Linux Shell基础知识

    一.文件系统和安全 chmod命令 chmod命令有两种模式,一种是符号模式,用ugo执行用户,用rwx执行权限:另一种是绝对模式,用八进制不同位置的不同值来代表不同用户的不同权限. 符号模式 chm ...

  4. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  5. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  6. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...

  7. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  8. linux shell 基础 使用日志与心得

    linux shell 基础 使用日志与心得 1.#!/bin/bash 第一行就出现#!/bin/bash是指此脚本使用/bin/bash来解释执行.其中,#!是一个特殊的表示符,其后,跟着解释此脚 ...

  9. shell基础知识总结

    1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...

随机推荐

  1. SiteCore Experience Analytics-路径分析地图

    路径分析地图 路径分析器是一个应用程序,允许您查看联系人在浏览网站时所采用的各种路径.您可以查看联系人在转换目标并与广告系列互动时所采用的路径,让您深入了解哪些路径为每次转化提供最佳参与价值,以及哪些 ...

  2. 20165215 2017-2018-2《Java程序设计》课程总结

    20165215 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 预备作业1:我期望的师生关系:令我记忆深刻的老师,期望的师生关系,本学期的学习规划. 预备作业二 ...

  3. VMware vSphere 5.x 与 vSphere 6.0各版本功能特性对比

    各版本中的新特性及功能对比:   VMware vSphere 5.0 VMware vSphere 5.1 VMware vSphere 5.5 VMware vSphere 6.0 ESXi 5. ...

  4. Bootstrap3基础 thumbnail 圆角类型的div块

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  5. 【BZOJ4031】小Z的房间

    Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...

  6. Java正则中为什么反斜线"\"需要用“\\\\”表示,原因详解。

    首先,我们需要知道在java字符串和正则表达式中,“\”都具有特殊的含义. 一.在Java的字符串中"\"有两个功能 (一)代表特殊字符:\t代表制表符,\n代表换行....等. ...

  7. HTML5常用API

    .Fullscreen 该API允许开发者以编程方式将Web应用程序全屏运行,使Web应用程序更像本地应用程序. .Page Visibility 该API可以用来检测页面对于用户的可见性,即返回用户 ...

  8. win10 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    更新Win10,原来的IIS站点访问不了,原因是因为IIS 没有.net 4.5,使用网上的aspnet_regiis.exe -i命令,一点都不靠谱,直接提示: C:\WINDOWS\system3 ...

  9. java基础 (二)之HashMap,HashTable,ConcurrentHashMap区别

    HashTable: put方法加了同步锁synchronized,底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable, ...

  10. Windows下命令行怎样登录MySQL

    直接cmd回车然后 “ mysql -u root -p  ”  登录时出现错误,原来是权限不够 打开cmd时需要以管理员的身份打开 然后继续使用 “ mysql -u root -p ” 还是不行, ...