• Linux shell基础知识(上)


    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

    终端登录

    7yd9i.jpg

    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

  • 相关阅读:
    4、[重点]Mybatis配置解析
    3、Mybatis的CRUD实现
    mybatis程序容易出错的地方
    1、初识Mybatis
    容易忽略的基础
    读取.properties配置文件的几种方式:
    格式化数字显示
    安装ipa文件
    保活一个线程
    地图经纬度的问题
  • 原文地址:https://www.cnblogs.com/minn/p/9120865.html
Copyright © 2020-2023  润新知