Linux命令、编辑器与Shell编程08.pdf
《Linux命令、编辑器与Shell编程08.pdf》由会员分享,可在线阅读,更多相关《Linux命令、编辑器与Shell编程08.pdf(75页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 8 Bourne Again Shell 本章要点:初始化文件 重定向标准错误输出 编写简单的 shell 脚本 作业控制 操作目录栈 参数和变量 进程 命令历史机制 重新执行和编辑命令 别名 函数 控制 bash 特性和选项 处理命令行 本章承接第 5 章内容,继续关注 Bourne Again Shell(bash)。注意 tcsh 某些功能的实现不同于 bash,本书会在合适的地方,标注出所讨论特性的另一个实现方法的所在位置。第 11 章延伸了本章的内容,探讨了控制流命令和 Bourne Again Shell 编程更高级的内容。bash 的主页是 www.gnu.org/softwa
2、re/bash。bash的 info 页面是 Bourne Again Shell 最完整的参考手册。Bourne Again Shell 和 TC Shell(tcsh)都是命令解释器,同时也是高级编程语言。作为命令解释器,它们通过提示符响应并处理用户在命令行界面上输入的命令。而作为一门编程语言,它们将处理存放在所谓 shell 脚本文件中的命令。如其他编程语言一样,shell 也有变量和控制流命令(比如 for 循环和 if 语句)。当把 shell 作为命令解释器时,用户可以定制工作环境。可以在命令提示符中显示当前工作目录的名称;或者创建一个函数或者 cp 的别名,使其不覆盖特定类型的文
3、件;又或者利用关键字变量改变 shell 工作方式的某些方面,等等。还可以编写脚本来执行用户的指令,还可以编写执行用户指令的脚本,这 第部分 shell 222 些脚本可以是包含较长复杂命令的单行脚本,也可以是更长的脚本,例如一个先运行报告、然后打印报告、打印完毕后还可发出提醒的脚本。更复杂的脚本本身就是程序,它们不仅仅运行其他程序。第 11 章中的一些示例就属于这样的脚本。大多数系统 shell 脚本都是在 Bourne Again Shell 下面编写并运行的。如果在单用户模式下工作,比如在启动系统或者执行系统维护、管理或者修理任务时,那么,熟悉该shell 将是非常有必要的。本章内容扩充
4、了第 5 章描述的 shell 的交互特性,解释了如何创建和运行简单的 shell脚本,讨论如何进行作业控制,介绍 shell 编程的基本方面,讨论命令历史和别名,同时还描述了命令行扩展。第 9 章内容为 TC Shell 的交互使用以及 TC Shell 编程,第 11 章则展示了一些关于 shell 编程的更有挑战性的问题。8.1 背景知识背景知识 Bourne Again Shell 基于一个早期的 UNIX shell 即 Bourne Shell。为避免冲突,本书将其称为原 Bourne Shell,它是由 AT&T Bell 实验室的 Steve Bourne 编写的。历经多年,原
5、 Bourne Shell 已经被扩充,但是它仍然还是很多商业版本 UNIX 的基本 shell。sh shell 由于原 Bourne Shell 悠久的历史和成功的应用,它被用来编写很多用于帮助管理 UNIX 系统的 shell 脚本。尽管 Bourne Again Shell 中包含了很多原 Bourne Shell中没有的扩展和特性,bash 仍然与原 Bourne Shell 保持兼容,这样用户就可以在 bash 下面执行 Bourne Shell 脚本。在 UNIX 系统下面,原 Boure Shell 称为 sh。在 Linux 系统下面,sh 则是 bash 的符号链接,这样可
6、以确保那些需要 Bourne Shell 的脚本仍然能够执行。当作为 sh 调用时,bash 将尽可能地模拟原 Bourne Shell。Korn Shell System V UNIX引入了Korn Shell(ksh),它由David Korn编写。这个shell扩充了原 Bourne Shell,并添加了很多新的特性。Bourne Agian Shell 的一些特性,比如命令别名和命令行编辑,都是基于 Korn Shell 的类似特性。POSIX 标准 PASC(IEEEs Portable Application Standards Committee,IEEE 的可移植应用标准委员会
7、)开发了相关 POSIX 族标准(Portable Operating System Interface,可移植操作系统接口)。www.opengroup.org/austin/papers/posix_faq.html 上有一个全面的FAQ(问答集),包含了很多链接。POSIX 标准 1003.2 描述了 shell 功能特性。Bourne Again Shell 提供的特性符合该POSIX 标准需求。人们正在努力使 Bourne Again Shell 完全遵守 POSIX 标准。在此期间,如果调用 bash 时使用-posix 选项,则 Bourne Again Shell 的行为将更加
8、符合 POSIX 需求。8.2 shell 基础基础 本节内容包括编写和使用初始化文件、重定向标准错误输出、编写和执行简单的shell脚本、命令分割和分组、实现工作控制和操作目录栈。第 8 章 Bourne Again Shell 223 8.2.1 初始化文件 当启动 shell 时,它将运行初始化文件初始化自己。具体运行哪个文件取决于该 shell是一个登录 shell 还是一个非登录 shell 的交互式 shell(比如通过命令 bash),又或者是一个非交互式 shell(用来执行 shell 脚本)。要想运行初始化文件中的命令,用户必须具备读权限。本节内容为 bash 初始化文件。
9、关于 tcsh 初始化文件,请参见第 9.2.1 节。1.登录 shell 本节讨论的这些文件由登录 shell 以及带上-login 选项的 shell 执行。登录 shell 本来就属于交互式 shell。/etc/profile shell 首先执行/etc/profile 中的命令。通过设置这个文件,超级用户可以为全系统内的所有 bash 用户建立默认特征。/.bash_profile、/.bash_login、/.profile 然后 shell 依次查找/.bash_profile、/.bash_login、/.profile(是用户主目录的速记符),并执行它找到的首个文件中的命令
10、。可以将命令放置在这些文件中以覆盖掉/etc/profile 文件中的默认设置。/.bash_logout 当用户注销时,bash 执行文件/.bash_logout 中的命令。这个文件中包含了退出会话时需要执行的清理任务常用到的命令,比如删除临时文件等。2.交互式非登录 shell 在交互式非登录 shell 中并不执行前面提到的初始化文件中的命令。然而,交互式非登录 shell 从登录 shell 继承了由这些初始化文件设置的 shell 变量。/etc/bashrc 尽管不是通过 bash 直接调用,许多/.bashrc 文件还是调用/etc/bashrc。这种安排使得超级用户可以为全系
11、统内的非登录 shell 建立默认特性。.bashrc 交互式非登录 shell 执行/.bashrc 文件中的命令,而登录 shell 的初始化文件(比如.bash_profile)通常会运行这个文件。这样,登录 shell 和非登录 shell 都可以使用.bashrc 中的命令。3.非交互式 shell 非交互式shell(如那些运行shell脚本的shell)并不执行前面描述的初始化文件中的命令。然而,这些 shell 从登录 shell 那里继承了由这些初始化文件设置的 shell 变量。BASH_ENV 非交互式 shell 查找环境变量 BASH_ENV(或者当作为 sh 调用时
12、为ENV),并执行由该变量命名的文件中的命令。4.建立初始化文件 尽管有很多种初始化文件和 shell,但用户通常只需要主目录下的.bash_profile和.bashrc 文件。.bash_profile 中类似下面的命令将为登录 shell 执行.bashrc(如果该文件存在)中的命令。if -f/.bashrc;then source/.bashrc;fi 第部分 shell 224 条件-f/.bashrc 测试主目录下是否存在名为.bashrc 的文件。参见第部分第 14.76节中关于 test 以及与之同义的 的更多详细信息。使用.bash_profile 设置 PATH 提示提示
13、 因为.bashrc 中的命令可能执行多次,并且因为子 shell 继承那些被输出的变量,所以最好将那些附加已有变量的命令放置到.bash_profile 文件中。比如,下面的命令将 home 目录的子目录 bin 添加到 PATH 中,应该将其放置到.bash_profile 文件中:PATH=$PATH:$HOME/bin 如果将这条命令放置到文件.bash_profile 中而不是文件.bashrc 中,那么只有在用户登录之后这个字符串才会附加到 PATH 变量。用户修改.bash_profile 文件中的变量,可以将在交互式会话中所做改动传递给子shell。相反,修改.bashrc 中
14、的变量,将覆盖掉继承自父 shell 的那些修改。下面是.bash_profile 和.bashrc 文件的示例。这些文件中的某些命令只有到了本章后面才会涉及。在任何初始化文件中,如果希望变量和函数可以被子进程访问,就必须将其输出。更多信息请参见第 11.3.2 节。$cat/.bash_profi1e if -f/.bashrc;then source/.bashrc#read local startup file if it exists fi PATH=$PATH:.#add the working directory to PATH export PSl=h W!$#set promp
15、t 在这个.bash_profile 文件中,第 1 条命令是执行用户.bashrc 文件中的命令(如果该文件存在的话)。下一条命令是添加 PATH 变量。通常在/etc/profile 文件中设置和输出 PATH,这样就没有必要在用户的初始化文件中再次输出。最后一条命令设置并输出控制用户提示符的 PS1 变量。下面是一个.bashrc 示例文件。第 1 条命令执行/etc/bashrc 文件中的命令(如果该文件存在的话)。接着,设置并输出 LANG 变量和 VIMINIT 变量,同时还创建了几个别名。最后一条命令定义了一个用于交换两个文件名的函数。$cat/.bashrc if -f/etc
16、/bashrc;then source/etc/bashrc#read global startup file if it exists fi set-o noclobber#prevent overwriting files unset MAILCHECK#turn off you have new mail notice export LANG=C#set LANC variable export VIMINIT=set ai aw#set vim options alias df=df-h#set up aliases 第 8 章 Bourne Again Shell 225 alias
17、 rm=rm-i#always do interactive rms alias 1t=1s-ltrh|tail alias h=history|tail alias ch=chmod 755 function switch()#a function to exchange the names#of two files local tmp=$switch mv$1$tmp mv$2$1 mv$tmp$2 5.“.”(句点)或者 source:在当前 shell 中运行初始化文件 在编辑诸如.bashrc 这类的初始化文件之后,要使这些修改起作用,用户没有必要注销然后再次登录,可以使用内置命令“
18、.”(句点)或者 source(在 bash 下面这是两个相同的命令,但是在 tcsh 下面只有 source 可用)。与其他命令一样,在命令行上,“.”后面必须有一个空格。内置命令“.”或者 source 用起来类似于运行一个 shell 脚本,但这些命令将该脚本作为当前进程的一部分运行。因此,当使用“.”或者 source 运行脚本的时候,在脚本中改变的变量也将影响到运行该脚本的 shell。可以使用“.”或者 source 命令来运行任何 shell 脚本,而不仅仅是初始化文件,但是可能会带来副作用(比如可能会修改用户依赖的 shell 变量的值)。如果将初始化文件作为常规 shell
19、脚本运行,并且不使用“.”或者source内置命令,那么启动脚本中创建的变量将只在运行该脚本的子shell中起作用,并不会影响到启动该脚本的 shell。更多信息请参见第 11.3.2 节。在下面的示例中,.bashrc 设置了几个变量并将 PS1 提示符设置为主机名。内置命令“.”使新值起作用。$cat/.bashrc export TERM=vtl00#set the terminal type export PSl=$(hostname-f):#set the prompt string export CDPATH=:$HOME#add HOME to CDPATH string stt
20、y kill U#set kill line to control-u$./.bashrc :8.2.2 符号命令 Bourne Again Shell 以多种方式使用符号(、)、和$。为了使冲突最小化,表 8-1列出了每种符号的最通用的用法,即便有些符号直到后面才会介绍。表 8-1 内置的符号命令 第部分 shell 226 符 号 命 令()子 shell$()命令替换()算术表达式计算,let 的同义词(当被括起来的值中包含等号时使用)$()算术扩展(不用于被括起来的值中包含等号的情形)test 命令 条件表达式,类似于,但添加了字符串比较 8.2.3 重定向标准错误输出 第 5 章介绍
21、了标准输出的概念,并解释了如何重定向命令的标准输出。除了标准输出之外,命令还可以将输出发送到标准错误输出。命令将错误消息发送到标准错误输出,这样就可以避免与发送到标准输出的信息混淆在一起。与处理标准输出一样,默认情况下,shell 将命令的标准错误输出发送到屏幕上。除非重定向标准输出和标准错误输出中的某一个,否则不能区分命令的输出到底是标准输出还是标准错误输出。本节讲述 Bourne Again Shell 使用的语法。如果使用 TC Shell,请参见第 9.3.4 节。文件描述符 文件描述符是程序发送输出和获取输入的地方。当执行一个程序时,运行该程序的进程打开了 3 个文件描述符,分别是:
22、0(标准输入)、1(标准输出)和 2(标准错误输出)。重定向输出符号()是 1的简写,它通知 shell 重定向标准输出。类似地,是 0将重定向标准错误输出。参见第 11.2 节以获取更多信息。下面的示例演示了如何将标准输出和标准错误输出重定向到不同的文件和相同的文件。当运行 cat 实用程序时,如果所带参数中的某个文件不存在,而另一个文件存在,那么 cat 将发送一条错误消息到标准错误输出,同时还将已存在的那个文件复制一份到标准输出。除非重定向,否则两条消息都将出现在屏幕上。$cat y Th-is-is y.$cat x cat:x:No such file or directory$ca
23、t x y cat:x:No such file or directory This is y.将命令的标准输出重定向时,发送到标准错误输出的输出将不受影响,仍然出现在屏幕上。$cat x y hold cat:x:No such file or directory$cat hold 第 8 章 Bourne Again Shell 227 This is y.类似地,当使用管道发送标准输出时,标准错误输出也不会受到影响。下面的示例将 cat 的标准输出通过管道发送给 tr(在本例中,这个程序将小写字母转换为大写字母)。cat 发送到标准错误输出的文本并没有转换,这是因为它直接发送到屏幕,并没
24、有经过这个管道。$cat x y|tr a-z A-Z cat:x:No such file or directory THIS IS Y.下面的示例将标准输出和标准错误输出重定向到不同的文件中。符号 2告诉 shell将标准错误输出(文件描述符为 2)重定向到的具体位置。1告诉 shell 将标准输出(文件描述符为 1)重定向到的具体位置。可以使用代替 1。$cat x y 1 holdl 2 ho1d2$cat holdl This is y.$cat ho1d2 cat:x:No such file or directory 复制文件描述符 在下一个示例中,1将标准输出重定向到文件 ho
25、ld。然后,2&1声明文件描述符 2 为文件描述符 1 的副本。这样做的结果是,标准输出和标准错误输出均被重定向到文件 hold 中。$cat x y 1 hold 2&1$cat hold cat:x:No such file or directory This is y.在这个示例中,1hold 放在了 2&1 的前面。如果将它们的顺序颠倒的话,在标准输出重定向到文件 hold 之前,标准错误输出就已经复制了标准输出的一个副本。这样一来,就只有标准输出被重定向到文件 hold。在下面的示例中,文件描述符 2 是文件描述符 1 的副本,通过一个到 tr 命令的管道将输出发送到文件描述符 1。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 命令 编辑器 Shell 编程 08
限制150内