美文网首页
Unix & Linux 大学教程 第11、12章shell

Unix & Linux 大学教程 第11、12章shell

作者: 小超_8b2f | 来源:发表于2019-06-12 21:36 被阅读0次
    1. 什么是shell?
    1. shell是一个程序,充当用户界面和脚本解释器,允许用户输入命令以及间接地访问内核的服务。
    2. shell是一个命令处理器,一个读取并解释所有输入命令的程序

    shell脚本

    由shell解释的程序

    11.2 Bourne shell家族:sh、ksh (Korn shell)、bash、zsh
    11.3. C-shell家族:csh、tcsh

    C-shell 和Tcsh不像Bourne家族那样擅于编程。尽管语法类C,但是不适合编写shell脚本。因此C-shell和Tcsh有许多设计缺陷。
    T是Tenex系统的简称

    11.5 临时改变shell

    当登录系统时,系统会自动启动一个shell。这个shell是\color{green}{登录shell}
    shell就是一个程序,可以像其它程序一样运行。这意味着任何时候,都可以停止当前的shell,并\color{green}{通过简单地运行一个新的shell启动另一个shell。}

    tcsh
    #当前shell(bash)暂停,新shell(Tcsh)启动
    ^D # 切换回bash
    cat /etc/shells #查看系统中支持的所有shell
    echo $SHELL 查看当前shell
    

    11.6 口令文件,改变登录shell:chsh

    /etc/passwd包含登录shell名称,因此改变登录shell,所需要的工作就是对/etc/passwd进行一个简单的修改。但是该修改不能直接进行。这样做太危险了,因为破坏/etc/passwd会严重破坏系统

    chsh [-s shell] [userid]

    $cat /etc/shells
    /bin/bash
    /bin/csh
    /bin/ksh
    /bin/sh
    /bin/tcsh
    /bin/zsh
    
    #为本登录用户更改登录shell
    chsh -s /bin/tcsh
    #管理员为xiaochao账号更改登录shell
    chsh -s /bin/tcsh xiaochao
    chsh -l #list  shells 等同于cat /etc/shells
    

    12.1交互式shell和非交互式shell

    交互式shell:与人进行沟通的shell
    非交互式shell:独立于人运行的shell(shell脚本)

    12.2 环境、进程和变量

    在Unix系统中,每个对象都被表示成一个文件或进程。简单地讲,文件存放数据或访问资源,而进程是正在执行的程序。因此,一个正在运行的shell就 是一个进程,同理,任何从shell中启动的程序也是一个进程。

    在进程运行的过程中,它需要访问所谓的\color{red}{环境},即一组用来存放信息的变量。

    变量:用来存储数据的实体
    变量名:引用变量的标识符
    :存储变量中数据
    变量命名规则:大小字母(A-Z)、小写字母(a-z)、数字(0-9)或下划线构成,且第一个字符必须是字母或下划线,不能是数字

    数据类型:字符串,没有赋值则为null

    子进程继承父进程的环境
    shell启动了一个vi程序
    父进程:shell
    子进程:vi

    在子进程创建时,系统为子进程复制了父进程的环境,我们说子进程继承了父进程的环境。这意味着父进程可以访问的所有环境变量子进程都可以访问。

    12.3 环境变量和shell变量

    \color{green}{全局变量}:可以在程序的任何地方使用。环境变量对进程可用,所以它们是全局变量。

    \color{green}{shell变量}:只在特定的shell中使用,并不属于环境,因此这些变量不从父进程传递给子进程,基于这一原因,我们村这种变量为局部变量。

    通常局部(shell)变量有2种:

    1. eg: c-shell 的ignoreeof变量来确定shell在用户按下^D的时候是否忽略eof信号
    2. shell脚本中的局部变量,临时存储器。

    名称命名规则:

    1. c-shell : 环境变量大写,shell变量小写
    2. Bourne shell:环境变量和shell变量都大写

    Bourne shell家族中,\color{green}{只允许创建局部变量},也就是说,每个新变量被自动地设置为shell变量。如果希望某个变量同时成为环境变量,必须使用export命令。

    #创建shell变量
    XIAOCHAO=cool
    
    #将shell变量变为 “shell + 环境”变量
    export XIAOCHAO
    $echo $XIAOCHAO
    

    一些变量在shell中和所有子进程中都有意义。Bourne Shell家族通过使用\color{green}{既是局部又是全局的变量}避免了这一问题。但是C-shell不允许这样做。

    面对这样的问题,\color{green}{c-shell定义了少数几个特殊的shell变量},这些变量分别绑定对应环境变量,无论何时,当这些变量改变时,shell会自动地更新对应的变量。

    shell 变量 环境变量 含义
    cwd PWD 当前工作目录
    home HOME home目录
    path PATH 搜索程序的目录
    term TERM 正在使用的终端类型
    user USER 当前用户标识
    12.4 显示环境变量:env、printenv
    12.5 显示shell变量:set

    不带选项和参数:显示所有的shell变量,此命令适用于所有shell。
    对于Bourne shell家族来说,shell变量都是大写字母的名称,因此只看变量名称无法确定这个变量是局部变量还是全局变量。唯一分辨的方法是env命令和set命令的结果进行对比

    Bourne shell家族不怎么使用shell变量,C-shell家族大量使用shell变量。

    控制shell行为

    C-Shell使用shell变量
    Bourne shell使用shell选项

    12.6 显示及使用变量的值:echo、print
    $ echo ${VAR_NAME}
    #如果没有歧义,可以省略大括号{}
    $ echo $VAR_NAME
    $ echo the terminal type is $TERM
    the terminal type is xterm-256color
    #多个变量同时打印
    $ echo $TERM $HOME $PATH $SHELL 
    #相邻字符不分开
    $ echo "My favorite sport is ${ACTIVITY}ing"
    My favorite sport is runing
    
    print : Korn Shell
    $ ksh
    $ print $TERM
    xterm-256color
    $ echo $TERM
    xterm-256color
    
    12.7 Bourne Shell家族使用变量:export、unset

    \color{green}{创建变量}的语法:NAME=value \color{red}{(等号两边不能有空格)}

    XIAOCHAO=smart
    XIAOYI="more smart"
    #一条命令导出多条变量
    export XIAOCHAO XIAOYI
    #分步骤
    XIAOCHAO=smart; export XIAOCHAO
    #同时创建shell变量和导出环境变量
    export XIAOCHAO=smart
    
    #多个变量同时赋值,同时设置为shell变量和环境变量
    export XIAOCHAO=smart  XIAOYI="more smart"
    

    当创建变量时,我们称这是在\color{green}{设置变量},当删除变量时,我们称这是\color{green}{复位变量}

    unset  *NAME...*
    
    12.8 C-Shell 家族使用变量:setenv、unsetenv、set、unset

    C-Shell在环境变量和shell变量之间有一个清晰的界限。明确区分全局变量和局部变量。

    setenv NAME [value] \color{red}{【注意:该命令中未使用=(等号)】}

    setenv PATH /usr/local/bin:/usr/bin:/bin
    setenv XIAOCHAO cool
    setenv XIAOYI "a cool girl"
    setenv NULLVALUE
    

    复位环境变量:unsetenv NAME

    unsetenv XIAOCHAO
    unsetenv XIAOYI NULLVALUE
    
    1. 设置和复位shell变量

    set name [=value]
    unset variable

    set term=vt100
    #C-Shell中用()将字符串扩起来,而不是双引号:""
    set path=(/usr/bin /bin /usr/ucb) 
    #设置空值,存在即忽略eof📶,要求用户使用logout结束shell
    set ignoreeof
    unset igonoreeof
    
    set xiaochao=cool
    set xiaochao
    unset xiaochao
    
    12.9 shell选项:set -o set +o
    1. shell是交互式的还是非交互式的是由shell选项控制的
    2. shell支持一个叫“作业控制”的功能,运行后台运行程序。打开作业控制需要运行monitor选项,关闭作业控制需要抚慰monitor选项。默认情况下,交互式的shell中monitor选项是打开的。

    两种设置方式:

    # 第一种,命令行选项方式
    ksh -m #启动一个ksh 设置(打开)monitor选项
    
    
    #第二种:set命令的变体 option是长名称
    set -o option  # 设置选项
    set +o option # 复位选项
    
    set -o monitor
    set +o monitor
    
    shell 选项 长名称 含义
    B K -a allexport 导出随后定义的所有变量和函数
    B . -B allexport 启用括号拓展(生成字符模式)
    B K -E emacs 命令行编辑器:EMACS模式,关闭vi模式
    B K -h hashall 查找命令时(记住)命令的哈希位置
    B . -H histexpand 历史列表启用!风格替换
    B . history 历史列表:启用
    B K -I ignoreeof 忽略eof信号^D;使用exit退出shell
    . K mkdirs 在通配时,在目录名中追加/
    B K -m monitor 作业控制:启用
    B K -C noclobber 不允许重定向的输出替换某个文件
    . K nolog 历史列表:不保存函数定义
    B K -b notify 作业控制:当后台作业结束时立即通知
    B K trackall 别名:为命令替换完整路径名
    B K -V vi 命令行编辑器:vi 模式,关闭Emacs模式
    . K viraw vi模式:立即处理每个键入的字符

    注意:bash支持emacs和vi选项,但是它不使用-E和-V
    除了上面表中说明的选项外,还有许多其他的shell选项,这些选项大多在非交互式的shell中有用(也就是说当编写shell脚本时)。另外,如果使用的是bash,那么有一个特殊的命令\color{red}{shopt(shell option,shell选项)},可以用来访问更多选项。

    12.10 显示shell选项
    set -o
    set +o
    set -o | less
    set +o | less
    
    set -o ignoreeof
    set +o ignoreeof
    
    #10次^D 后,才退出login shell
    #设置如下shell变量来设置ignoreeof的次数
    IGNOREEOF=20
    

    除非你是高级用户,否则只需要关注ignoreeof、monitor、noclobber选项即可。

    set用法总结
    1. 显示shell变量: set
    2. 创建shell变量
    3. 打开或关闭shell选项
    4. 显示shell选项
    思考

    环境变量并不是真正的全局变量,因为子进程对环境变量的修改并不能传递回父进程。

    set官方文档

    shell 选项 长名称 含义
    B -u nounset 忽略不存在的变量
    B -x xtrace 忽略不存在的变量
    B -e errexit 脚本只要发生错误,就终止执行
    B pipefail 有一个例外情况,就是不适用于管道命令

    参见:
    Bash 脚本 set 命令教程

    相关文章

      网友评论

          本文标题:Unix & Linux 大学教程 第11、12章shell

          本文链接:https://www.haomeiwen.com/subject/pxmlfctx.html