第13章 使用shell:命令和定制
13.1 元字符
字母数字字符 alphanumeric character
元字符 metacharacter
引用元字符:保护元字符不被错误解释
shell中使用的元字符
字符 |
名称 |
作用 |
{} |
|
花括号拓展:生成一种字符模式 |
| |
|
命令行:创建一个管道线 |
< |
|
命令行:重定向输入 |
> |
|
命令行:重定向输出 |
() |
|
命令行:在子shell中运行命令 |
# |
hash、pound |
命令行:注释的开头 |
; |
|
命令行:用于分隔多条命令 |
` |
反引号 |
命令行:命令替换 |
~ |
|
文件名拓展:插入home目录的名称 |
? |
|
文件名拓展:匹配任意一个字符 |
[] |
|
文件名拓展:与一组字符中的字符匹配 |
* |
|
文件名拓展:匹配0个或多个字符 |
! |
bang |
历史列表:事件标记 |
& |
|
作业控制:在后台运行命令 |
\ |
反斜线 |
引用:下一个字符转义 |
‘ |
单引号 |
引用:取消所有的替换 |
“ |
|
引用:取消大部分的替换 |
{} |
|
变量:确定变量名称的界限 |
$ |
|
变量:用变量的值替换 |
<Return> |
|
空白符:标记一行结束 |
<Tab> |
|
空白符:在命令行中分隔单词 |
<Space> |
|
空白符:在命令行中分隔单词 |
特别地:
- dash minus # hash pound
13.2 引用和转义
l 使用反斜线引用单个字符(又称转义)
l 使用单引号引用一串字符
l 使用双引号引用一串字符,但保留 $(美元)、`(反引号)和\(反斜线)的特殊含义
13.3 强引用(strong quote)和弱引用(weak quote)
反斜线是所有引用中最强的一个。
在某行的末尾键入\<Return>,新行字符被引用,光标移到下一行,但它并不是一行结束的信号。Bash在等待更多的键入。
13.4 shell内置命令:type
内置命令 builtin command简称builtin
外部命令
分辨内部命令与外部命令
(1)man (2)type type command...
13.5 学习内部命令
1.系统对于内置命令拥有独立的说明书页
2.使用help命令
help –m
13.6 外部命令及搜索路径
shell检查环境变量PATH,PATH中的字符串即搜索路径。
apropos builtins;man builtins
13.7 修改搜索路径
基本思想就是将修改PATH变量的命令放到登录时自动执行的初始化文件中。
Bourne shell
使用export将PATH变量设置为环境变量。
export PATH=”/bin:/usr/bin:/usr/ucb:/usr/local/bin”
修改默认的搜索路径
export PATH=”$PATH:$HOME/bin”
将搜索路径的值修改为旧值加上$HOME/bin,即将$HOME/bin追加到已有搜索路径的末尾。
在搜索路径的开头插入一个新目录
export PATH=”$HOME/bin:$PATH”
这个命令比较好,在搜索路径末尾添加当前目录
export PATH=”$PATH:$HOME/bin:.”
13.8 黑客如何使用搜索路径
寻找一种以root账户运行已经被修改的程序的方法,然后创建一个以后可以使用的后门。
确保所有系统管理员用户标识使用的搜索路径中没有包含工作目录,或者用户可能访问的其他任何目录。
13.9 shell提示
$ % > #
13.10 修改shell提示
环境变量PS1
export PS1=”$”
3种方法来增强shell
l 将变量的值插入到shell提示中
l 利用转义字符使用各种特殊码
l 将命令的结果插入到提示中(即命令替换)
13.11 使用变量的值
export PS1=”${VARIABLE}”
变量名
HOME HOSTNAME HOSTTYPE LOGNAME PWD RANDOM SECONDS SHELL USER
13.12 引用变量时使用哪类引号
export PS1=’Yourlucky number is ${RANDOM} $’ export PS1=”${USER}$”
该变量的值在使用之前是否会变化?
如果答案是肯定的,则使用强引用来防止$字符被解释,直至需要它们。否则使用弱引用,从而允许$字符被立即解释。
l 单引号,强引用,在单引号中,没有字符拥有特殊的含义。在引用${RANDOM}时使用的是单引号,从而允许保留$字符的含义,以便于稍后引用,确保直至创建实际提示时才对RANDOM求值。
l 双引号,弱引用,[$]、[`]和[\]符号保留各自的特殊含义。
13.13 使用转义字符的特殊码
Bash提示中使用的特殊码、命令和变量
含义 |
Bash |
工作目录:~表示法 |
\w |
工作目录:只有基名 |
\W |
工作目录:完整路径名 |
. |
计算机的主机名 |
\h |
当前用户标识 |
\u |
shell的名称 |
\s |
时间:AM/PM表示法 |
\@ |
时间:24小时制表示法 |
\A |
日期: |
\d |
历史列表 |
\! |
13.14 命令替换(command substitution)
命令替换允许在一条命令中嵌入另一条命令。shell首先执行嵌入的命令,并且用输出替换该命令,然后shell再执行整条命令。
echo “The time and date are `date`.”
使用反引号
13.15 键入命令并进行修改
历史列表、命令行编辑、自动补全、别名
export PS1=”\u$” export PS1=”${USER}$”
13.16 历史列表:fc、history
|
Bourne shell |
C-shell |
查看部分或全部历史列表 |
fc –l(list) |
history |
事件编号调取特定的命令 |
fc –s(substitute)number |
!number |
重复上一条命令 |
fc –s |
!! |
重新执行之前进行修改 |
fc –s patter=replace number |
!number:s/pattern/replacement |
微小修改长命令 |
fc –s q=e(同上) |
^pattern^replacement |
在历史列表中,每条命令称为一个事件,而每个事件都有一个内部编号,称为事件编号。历史列表的功能就是基于事件编号调取命令。例如,可以告诉shell调取命令#24。
fc fixcommand
^R 重新调用命令
13.17 历史列表:设置大小
export HISTORY=number
13.18 历史列表示例:避免删错文件
fc –s ls=rm ^ls^rm
13.19 在shell提示中显示事件编号&工作目录
显示历史列表的事件编号
export PS1=”bash[\!]$”<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);"> </span>
exportPS1=”(\w) bash[\!]$”
13.20 自动补全
显示所有可能
<Tab><Tab>
文件名补全 filename completion
C-shell <Esc>/<Tab> ^D
13.21 自动补全:高级应用
文件名补全、命令补全、变量补全、用户标识补全、主机名补全
13.22 为了好玩和赌注使用命令补全
13.23 命令行编辑:bindkey
命令行编辑是一种强大的工具,允许使用许多不同的命令操纵在命令行上键入的内容,包括使用历史列表和自动补全功能。
Emacs模式 vi模式
set –o emacs set –o vi
对于tcsh使用bindkey命令 bindkey –e
13.24 别名:alias、unalias
alias [name=commands]
将命令引用在单引号中,因为该命令包含有空格和元字符。强引用要比弱引用好,因为它们保留了元字符的含义,直至别名执行。
输入alias和别名的名称就可以查看这个别名的当前值。要同时显示所有的别名,可以使用没有参数的alias。
使用unalias可以移除别名。unalias name移除所有别名使用unalias –a(或unalias *)。type查看某条命名是不是别名。
13.25 临时挂起别名
命令开头键入一个\(反斜线)
13.26 别名示例:避免删错文件
rm !ls:*
13.27 别名示例:从历史列表中重用命令
13.28 别名示例:在shell提示中显示工作目录的名称