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

posted on 2019-08-26 15:44  青苹末末  阅读(159)  评论(1编辑  收藏  举报

导航