zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/minn/p/9120865.html
Copyright © 2011-2022 走看看