Unix & Linux 教程学习_6
第13章 使用shell:命令和定制
13.1 元字符
所有非字母数字字符: P247
字符 | 英文名称 | Unix绰号 |
---|---|---|
& | ampersand(和号) | --- |
' | apotrophe(撇号) | 引号、单引号 |
* | asterisk(星号) | 星号 |
@ | at sign(at 符号) | at |
` | backquote(反引号) | 反引号(backtick) |
\ | backslash(反斜线) | --- |
{} | brace brackets(花括号) | 花括号、波形括号 |
^ | circumflex(音调符号) | 插入记号 |
: | colon(冒号) | --- |
, | comma(逗号) | --- |
$ | dollar sign(美元符号) | 美元 |
<Return> | enter、return(回车) | 新行 |
= | equal sign(等号) | 等号 |
! | exclamation mark(感叹号) | bang |
> | greater-than sign(大于符号) | 大于 |
- | hyphen(连字符)、minus sign(减号) | 虚线、减号 |
< | less-than sign(小于号) | 小于 |
# | number sign(序数符号) | hash、pound |
() | parentheses(圆括号) | --- |
% | percent sign(百分比符号) | 百分比 |
. | period(点号) | 点 |
+ | plus sign(加号) | 加 |
? | question mark(问号) | --- |
" | quotation mark(引号) | 双引号 |
; | semicolon(分号) | --- |
/ | slash(斜线) | 正斜线 |
<Space> | space(空格) | --- |
[] | square brackets(方括号) | 方括号 |
<Tab> | tab(制表符) | --- |
~ | tide(波浪号) | --- |
_ | underscore(下划线) | --- |
| | vertical bar(竖线) | 管道 |
shell中使用的元字符 (P248)
字符 | 章号 | 名称 | 作用 |
---|---|---|---|
{} | 24 | 花括号 | 花括号扩展: 生成一种字符模式 |
| | 15 | 管道 | 命令行: 创建一个管道线 |
< | 15 | 小于 | 命令行: 重定向输入 |
> | 15 | 大于 | 命令行: 重定向输出 |
() | 15 | 圆括号 | 命令行: 在子shell中运行命令 |
# | 14 | hash 、pound | 命令行: 注释的开头, 忽略该行其余部分 |
; | 10 | 分号 | 命令行: 用于分隔多条命令 |
` | 13 | 反引号 | 命令行: 命令替换 |
~ | 24 | 波浪号 | 文件名扩展:插入home目录的名称 |
? | 24 | 问号 | 文件名扩展: 匹配任意一个字符 |
[] | 24 | 方括号 | 文件名扩展:与一组字符中的字符匹配 |
* | 24 | 星号 | 文件名扩展: 匹配0个或多个字符 |
! | 13 | bang | 历史列表: 事件标记 |
& | 26 | 和号 | 作业控制:在后台运行命令 |
\ | 12 | 反斜线 | 引用: 下一个字符转义 |
' | 12 | 引号,单引号 | 引用: 取消所有的替换 |
" | 12 | 双引号 | 引用: 取消大部分替换 |
{} | 12 | 花括号 | 变量: 确定变量名称的界限 |
$ | 12 | 美元符号 | 变量: 用变量的值替换 |
<Return> | 7 | 新行字符 | 空白符: 标记一行结束 |
<Tab> | 10 | 制表符 | 空白符: 在命令行中分隔单词 |
<Space> | 10 | 空格符 | 空折符: 在命令行中分隔单词 |
上表中有几个元字符用于文件名扩展,也称为“通配符(globbing)详情见P631页
13.2 引用和转义
有时候,可能希望按字面上的含义使用元字符, 而不使用其特殊的含义。必须告诉shell按字面意义解释字符。这样做时,称其为引用字符。
字符引用方法有三种:
- 使用反斜线\。 引用单个字符(称为转义了这个字符)。
- 使用单引号' '。 引用一串字符。
- 使用双引号" "。 引用一串字符, 但是保留$(美元)、 `(反引号)和\(反斜线)的特殊含义。
当使用反斜线引用单个字符时,我们称反斜线为“转义字符”
当程序位于一种特定模式,而我们将它修改到另一种模式时,称这是由一种模式转义到另一种模式。当通过按下特定键修改模式时,称该特定键为转义字符。
13.3 强引用与弱引用
有时候称单引号为 强引用 (strong quote), 双引号为 弱引用 (weak quote)。
实际上,反斜线是所有引用中最强的一个。反斜线可以引用任何东西。 反斜线如此强大,它甚至可以引用新行字符。
13.4 shell内置命令: type
上些命令在shell的内部, shell可以直接解释它们。 这些是内部命令,称为内置命令(builtin command), 其它所有命令是外部命令, 即必须独自运行的独立程序。
shell在自己的进程内运行内置命令。外部命令则shell搜索合适的程序,然后以一个单独的进程运行该命令。
查看某命令是否为内置命令的快捷方式就是用type命令:
type command...
例:
type date time set |
date is /bin/date time is a shell keyword set is a shell builtin |
13.5 学习内部命令
实际上,所有的内置命令都记录在shell的说明书页中。一些Unix/Linux系统对于内置命令拥有独立的说明书页。使用apropos命令:
例:
apropos builtin
如果系统上有这样的说明书页,那么它就是快速查看所有内置命令列表的地方。对于Linux和FreeBSD来说,可以使用:
man builtin
Linux还有一个help命令,可以以若干方式显示builtin说明书页的信息。该命令的语法为:
help [-s] [command...]
例:
help set
如果只希望查看某一条内置命令的语法,可以用-s(syntax,语法)选项:
thlp -s pwd history kill
13.6 外部命令及搜索路径
如果命令不是shell中内置的---大多数命令都不是内置的. 那么shell必须查找出合适的程序来执行。shell检查PHTH环境变量,PATH包含一串字符,这就是一系列目录名称,我们称之为__搜索路径__。
如果想查看搜索路径,那么显示PATH变量的值即可:
echo $PATH
可能的输出是:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
这个例子中,搜索路径包含以下5个目录:
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
13.7 修改搜索路径
使用export命令可以使PATH变量成为环境变量, 这意味着shell及所有随后生成的进程都可以使用它。例:
export PATH="/bin:/usr/bin:/usr/ucb:/usr/local/bin"
//各个名称之间用冒号隔开,而且等号的两边没有空格!
对于c-shell家族,设置的是shell变量path, 而不是环境变量PATH:
set path=(/bin /usr/bin /usr/ucb /usr/local/bin)
--++-----------------------------------------------
如果想修改搜索路径,如想把$HOME/bin加入到搜索路径中:
export PATH="$PATH:$HOME/bin"
//--++----------------------------------------------
如果指定一个点(.)字符,将向搜索路径中添加自己的“工作目录":
export PATH="$PATH:$HOME/bin:."
set path=($path $HOME/bin .)\(~~~~~~\) //c-shell家族
除非你是专家,否则最好谨慎行事,将自己的目录放在搜索路径的末尾!
13.8 黑客如何使用搜索路径
P259
13.9 shell提示
最初,所有的shell都是两个字符的提示:一个字符后跟一个空格。Bourne shell使用一个$(美元)字符,C-Shell使用一个%(百分比)字符。现在,这一传统仍然保持。
另一个惯例是关于超级用户的。当以root登录时,不管使用的是哪一种shell,shell提示总是一个#字符。需要格外小心。
13.10 修改shell提示
对于Bourne shell家族来说,需要修改一个PS1的环境变量(prompt for shell, number 1 <shell提示,编号1> )。C-Shell家族则要修改一个名为prompt的shell变量:
export PS1="$\(~\) "
set prompt="%\(~\) "
其他增强shell提示:
- 将变量的值插入到提示中
- 利用转义字符使用各种特殊码
- 将命令的结果插入到提示中(这就是所谓的命令替换)
13.11 使用变量的值
例: 将用户标识插入到提示中
export PS1="${USER}$\(~~\)"
set prompt = "${USER}%\(~~\)"
13.12 引用变量时使用哪类引号
仔细看两个例子:
export PS1='Your lucky number is $"RANDOM} $\(~~\)'
export PS1="${USER}$\(~~\)"
其中一条命令使用单引号, 而另一条命令使用双引号。
使用两种不同类型引号的原因在于所用的两个变量,RANDOM变量发生变化,USER变量不发生变化。
在引用${USER}时,用双引号,从而允许将$字符解释成元字符,这意味着在处理该命令时,USER的值就固定下来了。
而在引用${RANDOM}时用单引号,保留$字符的(字面)含义,以便稍后使用。 这一技术确保直到创建实际提示时才对RANDOM求值。
前面说过,单引号是强引用,‘${VARIABLE}'时,所有的字符都取字面上的含义,$字符保留下来,以便稍后使用其原本含义。
当使用"${VARIABLE}"时,$字符就被解释成元字符,而整个表达式在这个时刻就被替换为VARIABLE的值。
因此,当需要引用变量时,要想一想:“该变量的值在使用之前是否会变化?” 如果是变的,则使用强引用来防止$字符被解释,直到需要它们。否则就用弱引用(双引号),从而允许$字符被立即解释。
13.13 使用转义字符的特殊码
参见: P264