第1页:第13章使用shell:命令和定制
本页为第13章使用shell:命令和定制的章节封面,标示本章讲解的元字符、搜索路径、历史列表与别名。
第2页:本章需要解决的几个问题
- 什么是元字符?
- 引用字符的3种不同方式是什么?
- 什么是内置命令?
第3页:13.1元字符
- 字母数字字符-在输入时,所见即所得的字母和数字字符。
- 元字符-拥有特殊含义的字符。-如:$、;、|、<、>等。
第4页:13.2引用和转义
- 引用字符-在输入时,告诉shell,希望按字面含义解释字符,而不使用其特殊含义。
第5页:13.2引用和转义:引用字符的3种方法-
- 引用字符的3种方法-1.使用反斜线引用单个字符echo It is a warm and sunny\; come here当我们使用反斜线引用单个字符时,称反斜线为转义字符。
第6页:13.2引用和转义:引用字符的3种方法-
- 引用字符的3种方法-2.使用单引号引用一串字符echo ‘It is a warm and sunny; come & visit’
第7页:13.2引用和转义:引用字符的3种方法-
- 引用字符的3种方法-3.使用双引号引用一串字符,但是保留$、`(反引号)和\(反斜线)的特殊含义、echo “My userid is <$USER>;”
第8页:13.3强引用和弱引用
- 按引用能力的强弱可以分为强引用和弱引用
- 单引号称为强引用
- 双引号称为弱引用
- 反斜线最强,但没有特殊称呼。例子:反斜线可以引用<Return>$ date\<Return>
第9页:13.4 shell内置命令type
- shell命令分类
- 内部命令(内置命令)由shell直接解释
- 外部命令执行命令对应的程序
第10页:shell内置命令type:如何判断命令
- 如何判断命令是否是内置的?-使用type命令typecommand…如:$ type date time setdate is /bin/datetime is a shell keywordset is shell builtin特殊的内部命令,用于编程内置命令
第11页:13.5学习内部命令
- 方式1
- 看shell的说明书页-man bashman kshman tcshman csh
第12页:13.5学习内部命令:方式2
- 方式2:看内置命令的说明书页-apropos builtinman builtin (FreeBSD)man shell_builtin (Solaris)man csh
第13页:13.5学习内部命令:方式3
- 方式3
- 使用help命令-help[-s] [command…]-s:只看语法定义例子:help set | less
第14页:13.6外部命令及搜索路径
- shell在什么地方查找外部命令?-环境变量PATH中保存的路径,这个路径又被称为“搜索路径”
第15页:13.7修改搜索路径
- 修改路径的三种情形:-1.重新设置路径例子:Bourne shell:export PATH=“/bin:/usr/bin:/usr/local/bin”C-Shellset path=(/bin /usr/bin usr/local/bin)
第16页:13.7修改搜索路径:修改路径的三种情形
- 修改路径的三种情形:-2.将新路径加到PATH路径的后面例子:Bourne shell:export PATH=“$PATH:$HOME/bin”C-Shellset path=($path $HOME/bin)
第17页:13.7修改搜索路径:修改路径的三种情形
- 修改路径的三种情形:-3.将新路径加到PATH路径的前面例子:Bourne shell:export PATH=“$HOME/bin:$PATH”C-Shellset path=($HOME/bin $path)
第18页:13.8黑客如何使用搜索路径
- 黑客利用搜索路径入侵系统步骤:-step1:将入侵程序ls放到自己的工作目录-step2:将自己工作目录放到PATH的前面export PATH=“.:$PATH”-step3:请求管理帮助,管理员以root登录
第19页:黑客如何使用搜索路径
- 黑客利用搜索路径入侵系统步骤:-step4:管理运行ls命令查看目录时,就运行了黑客的ls程序-step5:黑客的ls除了系统ls的功能之外,还有一个副作用。在以root权限运行它的时候,会创建一个拥有特殊权限的秘密文件。-step6:黑客通过这个文件(或称后门)获取超级用户的访问权限。
第20页:13.9 shell提示
第21页:13.10修改shell提示
- 修改shell提示的方法-Bourne shellexport PS1=“newvalue”-C-Shellset prompt = “newvalue”
第22页:修改shell提示:export PS1
- 例子export PS1=“bash$”export PS1=“ksh$”set prompt = “chs%”set prompt = “tchs>”
第23页:修改shell提示:三种增强shell的
- 三种增强shell的方式:-1.将变量的值插入到提示符中-2.利用转义字符使用各种特殊码-3.将命令的结果插入到提示中(称为命令替换)
第24页:13.11将变量的值插入到提示符中
- export PS1=“${VARIABLE}$”set prompt =“${VARIABLE}%”
第25页:将变量的值插入到提示符中
第26页:13.12引用变量时使用哪类引号
- 看两个例子export PS1=‘Your lucky number is ${RANDOM}$’export PS1=“${USER}$”
第27页:13.12引用变量时使用哪类引号:Why
- Why?-因为第一个中RANDOM的值是每次显示shell提示符的时候都在变化的,需要在PS1的值中将其解释为元字符,因此使用强引用;-第二个中,PS1在赋值的时候,已经将${USER}用当前用户标识做了替换。
第28页:13.13利用转义字符使用各种特殊码
- 什么是特殊码?-转义字符加上一个非元字符例如:\w\h\u
- 并非所有shell都支持特殊码-只有bash和tcsh支持
- 下图给出shell支持的特殊码
第29页:利用转义字符使用各种特殊码:什么是特殊码
本页为课件图示页,源文件仅保留小节标题“13.13利用转义字符使用各种特殊码”,配合图形讲解什么是特殊码、并非所有shell都支持、下图给出shell支持的等内容,建议对照原图补充细节。
第30页:13.14命令替换
- 什么是命令替换?-看个例子$ echo “Date and time is`date`”Date and time is Mon Dec 21 10:30:00 2012
第31页:13.14命令替换:什么是命令替换
- 什么是命令替换?-看个例子$ echo “Date and time is`date`”Date and time is Mon Dec 21 10:30:00 2012
第32页:13.14命令替换:命令替换的定义-
- 命令替换的定义-在一条命令中嵌入另一条命令。shell首先执行嵌入的命令,并用输出替换该命令。然后shell在执行整个命令。
第33页:13.14命令替换:在shell提示进行
- 在shell提示进行命令替换-例子1:将shell的名称放入到shell提示中。export PS1=“`basename ${SHELL}` $”-例子2:将userid放入到shell提示中。export PS1=“`whoami` $”
第34页:13.15键入命令并进行修改
- 命令行编辑
- 自动补全
- 别名
- 修改已键入命令的几种方法:-历史列表
第35页:13.16历史列表
- 查看历史列表的命令:-Bourne shell:fc-C-Shell:history和!在使用这几个命令之前,先了解几个名词。
第36页:13.16历史列表:跟历史列表相关的几个
- 跟历史列表相关的几个名词-事件
- 历史列表中的每一条命令称为一个事件。-事件编号:每个事件有一个内部编号,称为事件编号。
第37页:历史列表:历史列表的内容$ fc1
- 历史列表的内容$ fc1 ls2 who3 datq4 date5 vi tempfile6 fc
第38页:13.16历史列表:利用历史列表执行命令
- 利用历史列表执行命令-1.执行历史列表中指定编号的命令Bourne shell:fc-s[number]C-Shell:!number例如:执行who命令$ fc-s 2
第39页:13.16历史列表:利用历史列表执行命令
- 利用历史列表执行命令-2.执行历史列表最新的命令Bourne shell:fc-sC-Shell:!!例如:执行who命令$ fc-s 2
第40页:13.16历史列表:利用历史列表执行命令
- 利用历史列表执行命令-3.在命令执行之前修改命令Bourne shell:fc-spattern=replacement numberC-Shell:!number:s/pattern/replacement/例如:将命令列表中vi命令的参数改为data$ fc-s tempfile=data 5% !5:s/tempfile/data/
第41页:13.16历史列表:利用历史列表执行命令
- 利用历史列表执行命令-4.在命令执行之前修改最近用过的命令Bourne shell:fc-spattern=replacementC-Shell:^pattern^replacement例如:假设vi tempfile是最近用过的命令,将tempfile修改为data$ fc-s tempfile=data% ^tempfile^data
第42页:13.17历史列表:设置大小
- 历史列表怎么保存?-保存在一个文件中,称为历史文件。-对于Bourne shell来说,历史文件可以被自动保存和恢复。-对于C-Shell来说,只有设置了shell变量savehist,才会自动保存和恢复。
第43页:历史列表:设置大小:设置历史列表大小
- 设置历史列表大小-Bourne shell:export HISTSIZE=size-C-Shell:set history =size如果希望当前的历史列表中的n条命令保存到下一个回话,则设置savehist的值:set savehist =n
第44页:13.18历史列表:避免删错文件
- 以例子说明用户想删除temp和extra开头的文件,那么他可以使用如下命令:rm temp* extra*。但是用户怕其中有一些重要的文件被错删,因此使用ls temp* extra*进行查看。确认没有错误后,再使用rm temp* extra*进行删除。
第45页:历史列表:避免删错文件
- 正常的处理过程$ ls temp* extra*$ rm temp* extra*利用历史列表的处理过程$ ls temp* extra*$ fc-s ls=rm或% ls temp* extra*% ^ls^rm避免输入错误
第46页:在shell提示中显示事件编号&工作目录
- 在shell提示中显示事件编号export PS1=“bash[\!] $”export PS1=“ksh[!] $”set prompt =“csh[\!] %”set prompt =“tcsh[%\!] >”
第47页:在shell提示中显示事件编号&工作目录
- 在shell提示中显示工作目录export PS1=“bash(\w) $”export PS1=‘ksh(${PWD}) $’export PS1=“ksh(\${PWD}) $”set prompt =“csh[\!] %”set prompt =“tcsh(%~) >”
第48页:13.20自动补全
- 以例子说明(bash)$ touch xaax xabx xacx xccx$ ls xc<Tab>$ ls xccx$ ls xa<Tab>$ ls xa<Tab><Tab>xaax xabx xacx$ ls xa
第49页:13.20自动补全:自动补全键显示所有可
- 自动补全键显示所有可能补全单词shell<Tab> <Tab><Tab>Bash<Esc>=<Esc>Korn Shell^D<Esc>C-Shell^D<Tab>Tcsh
第50页:13.21自动补全:高级应用
- 自动补全类型补全对象自动补全Shell文件和目录文件名补全B K C T命令、路径命令补全B· · T变量变量补全B· · T系统上的用户标识用户标识补全B· C T局域网上的计算机主机名补全B· · ·
第51页:不使用显示所有环境变量
- 3种方式
- -env^M-env^J-<Tab><Tab>
第52页:13.23命令行编辑
- :bindkey
- 什么是命令行编辑?-在shell的命令行上进行文本编辑。包括:输入和修改命令、使用历史列表和使用自动补全。-shell的命令行编辑可以使用vi或Emacs的命令如果使用vi命令,则shell处于vi模式;如果使用Emacs命令,则shell处于Emacs模式。
第53页:命令行编辑:设置命令行编辑模式-
- 设置命令行编辑模式-bash和Korn shellset-o emacsset-o vi-Tcshbindkey-ebinkey-v
第54页:13.24别名
- 定义别名-Bourne shell:alias[name=commands]-C-Shell:alias[name commands]
第55页:13.24别名:$ alias lt
- 例子$ alias lt=‘ls-l temp*’$ alias info=‘date;who’
第56页:13.24别名:怎么区分命令
- 怎么区分命令和别名-使用type命令$ type infoinfo is aliased to ‘date;who’
第57页:13.24别名:查看别名的值-查看指
- 查看别名的值-查看指定别名
- aliasname-查看所有别名:alias
第58页:13.24别名:删除别名-删除指定别
- 删除别名-删除指定别名unaliasname-删除所有别名Bourne shell: unalias-aC-Shell:alias *
第59页:13.25临时挂起别名
- 别名与原始命令一样,需要执行原始命令的时候怎么办?-临时挂起别名:/别名例如:$ alias ls=‘ls-l’$ ls(执行别名)$ /ls(执行原始命令)
第60页:13.26别名示例:避免删错文件
- 在13.18中有使用历史列表避免删错文件的例子$ ls temp* extra*$ fc-s ls=rm可以给第二条命令一个别名$ alias del=‘fc-s ls=rm’这样可以直接输入$ ls temp* extra*$ del进一步避免了书写错误。
第61页:别名示例:避免删错文件
- 对于C-Shell比较麻烦% ls temp* extra*% ^ls^rm不能给第二条命令定义一个别名% alias del ‘rm\!ls:*’这样可以直接输入% ls temp* extra*% del
第62页:13.27别名示例:从历史列表中重用命令
- 示例$ alias r=‘fc-s’$ r$ r 2$ r 5 tempfile=date$ r d
第63页:别名示例:在shell提示中显示工作目录
- 在C-Shell中将$PWD放在提示中,无法自动更新。因此,给出替代方法:% alias cd ‘cd\!* && set prompt=“($PWD)%” ’% cd bin(/home/harley/bin)%其中:\!*指在原始命令行上键入的任何参数,执行完原始cd命令后,其参数传递给别名cd。