欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Linux命令、编辑器与Shell编程08.pdf

    • 资源ID:70321228       资源大小:1.14MB        全文页数:75页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Linux命令、编辑器与Shell编程08.pdf

    8 Bourne Again Shell 本章要点:初始化文件 重定向标准错误输出 编写简单的 shell 脚本 作业控制 操作目录栈 参数和变量 进程 命令历史机制 重新执行和编辑命令 别名 函数 控制 bash 特性和选项 处理命令行 本章承接第 5 章内容,继续关注 Bourne Again Shell(bash)。注意 tcsh 某些功能的实现不同于 bash,本书会在合适的地方,标注出所讨论特性的另一个实现方法的所在位置。第 11 章延伸了本章的内容,探讨了控制流命令和 Bourne Again Shell 编程更高级的内容。bash 的主页是 www.gnu.org/software/bash。bash的 info 页面是 Bourne Again Shell 最完整的参考手册。Bourne Again Shell 和 TC Shell(tcsh)都是命令解释器,同时也是高级编程语言。作为命令解释器,它们通过提示符响应并处理用户在命令行界面上输入的命令。而作为一门编程语言,它们将处理存放在所谓 shell 脚本文件中的命令。如其他编程语言一样,shell 也有变量和控制流命令(比如 for 循环和 if 语句)。当把 shell 作为命令解释器时,用户可以定制工作环境。可以在命令提示符中显示当前工作目录的名称;或者创建一个函数或者 cp 的别名,使其不覆盖特定类型的文件;又或者利用关键字变量改变 shell 工作方式的某些方面,等等。还可以编写脚本来执行用户的指令,还可以编写执行用户指令的脚本,这 第部分 shell 222 些脚本可以是包含较长复杂命令的单行脚本,也可以是更长的脚本,例如一个先运行报告、然后打印报告、打印完毕后还可发出提醒的脚本。更复杂的脚本本身就是程序,它们不仅仅运行其他程序。第 11 章中的一些示例就属于这样的脚本。大多数系统 shell 脚本都是在 Bourne Again Shell 下面编写并运行的。如果在单用户模式下工作,比如在启动系统或者执行系统维护、管理或者修理任务时,那么,熟悉该shell 将是非常有必要的。本章内容扩充了第 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 编写的。历经多年,原 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 的符号链接,这样可以确保那些需要 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 的可移植应用标准委员会)开发了相关 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 的行为将更加符合 POSIX 需求。8.2 shell 基础基础 本节内容包括编写和使用初始化文件、重定向标准错误输出、编写和执行简单的shell脚本、命令分割和分组、实现工作控制和操作目录栈。第 8 章 Bourne Again Shell 223 8.2.1 初始化文件 当启动 shell 时,它将运行初始化文件初始化自己。具体运行哪个文件取决于该 shell是一个登录 shell 还是一个非登录 shell 的交互式 shell(比如通过命令 bash),又或者是一个非交互式 shell(用来执行 shell 脚本)。要想运行初始化文件中的命令,用户必须具备读权限。本节内容为 bash 初始化文件。关于 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(是用户主目录的速记符),并执行它找到的首个文件中的命令。可以将命令放置在这些文件中以覆盖掉/etc/profile 文件中的默认设置。/.bash_logout 当用户注销时,bash 执行文件/.bash_logout 中的命令。这个文件中包含了退出会话时需要执行的清理任务常用到的命令,比如删除临时文件等。2.交互式非登录 shell 在交互式非登录 shell 中并不执行前面提到的初始化文件中的命令。然而,交互式非登录 shell 从登录 shell 继承了由这些初始化文件设置的 shell 变量。/etc/bashrc 尽管不是通过 bash 直接调用,许多/.bashrc 文件还是调用/etc/bashrc。这种安排使得超级用户可以为全系统内的非登录 shell 建立默认特性。.bashrc 交互式非登录 shell 执行/.bashrc 文件中的命令,而登录 shell 的初始化文件(比如.bash_profile)通常会运行这个文件。这样,登录 shell 和非登录 shell 都可以使用.bashrc 中的命令。3.非交互式 shell 非交互式shell(如那些运行shell脚本的shell)并不执行前面描述的初始化文件中的命令。然而,这些 shell 从登录 shell 那里继承了由这些初始化文件设置的 shell 变量。BASH_ENV 非交互式 shell 查找环境变量 BASH_ENV(或者当作为 sh 调用时为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 提示提示 因为.bashrc 中的命令可能执行多次,并且因为子 shell 继承那些被输出的变量,所以最好将那些附加已有变量的命令放置到.bash_profile 文件中。比如,下面的命令将 home 目录的子目录 bin 添加到 PATH 中,应该将其放置到.bash_profile 文件中:PATH=$PATH:$HOME/bin 如果将这条命令放置到文件.bash_profile 中而不是文件.bashrc 中,那么只有在用户登录之后这个字符串才会附加到 PATH 变量。用户修改.bash_profile 文件中的变量,可以将在交互式会话中所做改动传递给子shell。相反,修改.bashrc 中的变量,将覆盖掉继承自父 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 prompt 在这个.bash_profile 文件中,第 1 条命令是执行用户.bashrc 文件中的命令(如果该文件存在的话)。下一条命令是添加 PATH 变量。通常在/etc/profile 文件中设置和输出 PATH,这样就没有必要在用户的初始化文件中再次输出。最后一条命令设置并输出控制用户提示符的 PS1 变量。下面是一个.bashrc 示例文件。第 1 条命令执行/etc/bashrc 文件中的命令(如果该文件存在的话)。接着,设置并输出 LANG 变量和 VIMINIT 变量,同时还创建了几个别名。最后一条命令定义了一个用于交换两个文件名的函数。$cat/.bashrc if -f/etc/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 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 这类的初始化文件之后,要使这些修改起作用,用户没有必要注销然后再次登录,可以使用内置命令“.”(句点)或者 source(在 bash 下面这是两个相同的命令,但是在 tcsh 下面只有 source 可用)。与其他命令一样,在命令行上,“.”后面必须有一个空格。内置命令“.”或者 source 用起来类似于运行一个 shell 脚本,但这些命令将该脚本作为当前进程的一部分运行。因此,当使用“.”或者 source 运行脚本的时候,在脚本中改变的变量也将影响到运行该脚本的 shell。可以使用“.”或者 source 命令来运行任何 shell 脚本,而不仅仅是初始化文件,但是可能会带来副作用(比如可能会修改用户依赖的 shell 变量的值)。如果将初始化文件作为常规 shell 脚本运行,并且不使用“.”或者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 stty 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 章介绍了标准输出的概念,并解释了如何重定向命令的标准输出。除了标准输出之外,命令还可以将输出发送到标准错误输出。命令将错误消息发送到标准错误输出,这样就可以避免与发送到标准输出的信息混淆在一起。与处理标准输出一样,默认情况下,shell 将命令的标准错误输出发送到屏幕上。除非重定向标准输出和标准错误输出中的某一个,否则不能区分命令的输出到底是标准输出还是标准错误输出。本节讲述 Bourne Again Shell 使用的语法。如果使用 TC Shell,请参见第 9.3.4 节。文件描述符 文件描述符是程序发送输出和获取输入的地方。当执行一个程序时,运行该程序的进程打开了 3 个文件描述符,分别是: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$cat 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 发送到标准错误输出的文本并没有转换,这是因为它直接发送到屏幕,并没有经过这个管道。$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将标准输出重定向到文件 hold。然后,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。$cat x y 2&1|tr a-z A-Z CAT:X:NO SUCH FILE OR DIRECTORY THIS IS Y.发送错误到标准错误输出 还可以使用 1&2 将命令的标准输出重定向到标准错误输出。shell 脚本中经常使用这项技术将 echo 的输出发送到标准错误输出。在下面的脚本中,第 1 个 echo 命令的标准输出被重定向到标准错误输出:$cat message_demo echo This is an error message.1&2 echo This is not an error message.第部分 shell 228 如果重定向 message_demo 的标准输出,那么像第 1 条 echo 命令产生的那些错误消息将打印到屏幕,这是因为还没有重定向标准错误输出。因为 shell 脚本的标准输出经常被重定向到另一个文件,所以可以使用这项技术显示脚本产生的错误消息。lnks 脚本就使用了这项技术。在脚本中,还可以使用内置命令 exec 创建另外的文件描述符,并重定向 shell 脚本的标准输入、标准输出和标准错误输出。Bourne Again Shell 所支持的重定向操作符如表 8-2 所示。表 8-2 重定向操作符 操 作 符 含 义 filename 除非文件 filename 已存在并且设置了 noclobber 标记,否则标准输出将被重定向到文件 filename;如果文件 filename 不存在且没有设置 noclobber 标记,那么重定向操作将创建该文件|filename 即使文件 filename 存在且设置了 noclobber 标记,仍将标准输出重定向到该文件 filename 除非文件 filename 已存在并且设置了 noclobber 标记,否则标准输出将被重定向到文件 filename,并将内容添加到原文件的末尾;如果没有设置 noclobber 标记,并且文件 filename 不存在,那么将创建该文件&m 从文件描述符 m 复制标准输出或者文件描述符 n(如果命令中指定了 n)n&-关闭标准输出或者文件描述符 n(如果指定了 n)8.2.4 编写一个简单的 shell 脚本 shell 脚本是包含 shell 可执行命令的文件。shell 脚本中的命令可以是用户在 shell 提示符后面输入的任何命令。比如,shell 脚本中的某条命令可以运行某个 Linux 实用程序、编译过的程序或者是另一个 shell 脚本。与用户在命令行下输入的命令一样,shell 脚本中的命令可以引用任意文件,并可以有自己的输入和输出,这些输入和输出可能从某个文件重定向而来或定向到某个文件,又或者是通过管道发送。脚本本身的输入和输出也可以使用管道和重定向技术。除了可以使用用户在命令行下面输入的命令之外,shell 脚本还可以使用控制流命令(也称为控制结构)。使用这组命令可以改变脚本中命令的执行顺序,就像使用结构化程序编程语言改变语句的执行顺序一样。查阅第 11.1 节和第 9.7 节可以知道更多细节。shell 一条接着一条地解释并执行 shell 脚本中的命令。这样使用 shell 脚本就可以简单快速地启动一个复杂的任务序列或者是一个重复性的过程。1.chmod:使文件可执行 要想用 shell 脚本的文件名作为命令执行该脚本,用户必须具有该脚本的文件读权限和执行权限(参见第 4.4 节)。读权限使用户可以读取包含脚本的文件。而执行权限告诉 第 8 章 Bourne Again Shell 229 shell 和系统,该文件的所有者、组用户或者其他用户可以执行这个文件,它暗示这个文件的内容是可以执行的。当使用编辑器创建 shell 脚本的时候,该文件通常并没有设置执行权限。下面的示例给出了一个名为 whoson 的文件,其中包含 shell 脚本:$cat whoson date echo Users Currently Logged In who$whoson bash:./whoson:Permission denied 将文件名 whoson 作为命令并不能执行它,这是因为用户还不具备这个文件的执行权限。shell 并不认同 whoson 是一个可执行文件,因此当用户试图执行它时就会出现一条错误消息。如果将该文件名作为 bash 的参数(bash whoson),那么 bash 将该参数作为一个 shell 脚本并执行它。这时,bash 是可执行的,而 whoson 是 bash 将要执行的参数,因此用户不必具备 whoson 的执行权限。同样,也可以这样使用 tcsh 脚本文件。命令未找到?提示提示 如果看到下面的消息:$whoson bash:whoson:command not found shell 并不在当前工作目录下面查找可执行文件。而如果按照下面的格式输入这条命令:$./whoson./明确地告诉 shell,在当前工作目录下面查找可执行文件。为了修改 shell 环境,让 shell 能够自动在当前工作目录下面查找命令,请参见第 8.3.3 节。chmod 实用程序可以改变文件关联的访问权限。图 8-1 给出了带-l 选项的 ls 命令的执行结果,该命令显示了文件 whoson 在使用 chmod 命令修改该文件所有者的可执行权限前后的访问权限。第部分 shell 230 图 8-1 使用 chmod 命令将 shell 脚本变成可执行文件 在第 1 个 ls 命令的显示结果中,第 4 个字符为连字符(-),它指出该文件的所有者没有执行该文件的权限。接下来的 chmod 命令赋予了文件所有者可执行权限:u+x 指示chmod 为文件所有者(u)添加可执行权限(x)。u 代表 user,尽管它表示该文件的所有者(owner),但该所有者并不是在任何时候都是该文件的用户(user)。第 2 个参数是该文件的文件名。在第 2 个 ls 命令的显示结果中,第 4 个字符是 x,指出文件所有者具备执行权限。如果其他用户也要执行这个文件,就必须改变该文件的组访问权限和其他用户访问权限。任何用户要想把文件名作为命令执行,都必须具备执行访问权。如果该文件是一个 shell 脚本,用户尝试执行这个文件时,还必须具备读访问权限。而在执行一个二进制可执行文件(已编译程序)时,并不需要读访问权限。图 8-1 中的最后一条命令给出了 shell 将文件名作为命令执行的情况。要想进一步了解这方面的内容,请参见第 4.4 节和第部分的 ls 和 chmod。2.#!指定 shell 在 shell 脚本文件的第 1 行可以放置一行特殊的字符串,告诉操作系统使用哪个 shell来执行这个文件。因为操作系统在试图 exec(execute,执行)文件之前将检查该程序的开头字符串,这些字符让操作系统不必进行失败的尝试。如果脚本的前两个字符是#!,那么系统将这两个字符后面的那些字符作为用来执行该脚本的命令解释器的绝对路径名。它可以是任何程序的路径名,而并不仅仅是 shell。下面的示例指定由 bash 来运行这个脚本:$cat bash_script#!/bin/bash echo This is a Bourne Again Shell script.如果想在不同于启动脚本 shell 的其他 shell 中运行脚本,那么,#!字符就可以派上用场。下面的示例给出了一个应该由 tcsh 执行的脚本:$cat tcsh_script#!/bin/tcsh 第 8 章 Bourne Again Shell 231 echo This is a tcsh script.set person=jenny echo person is$person 因为有#!这么一行字符,所以操作系统可以确定由 tcsh 来执行这个脚本,而不管用户当前正在运行的 shell。在 shell 脚本中可使用 ps f 来显示正在执行该脚本的 shell 的名字。下面的示例中 ps显示的 3 行内容给出了运行父 shell 的进程、运行 tcsh 脚本的进程以及运行 ps 命令的进程:$cat tcsh_script2#!/bin/tcsh ps-f$tcsh_script2 UID PID PPID C STIME TTY TIME CMD alex 3031 3030 0 Novl6 pts/4 00:00:00-bash alex 9358 3031 0 21:13 pts/4 00:00:00/bin/tcsh./tcsh_script2 alex 9375 9358 0 21:13 Pts/4 00:00:00 ps-f 如果在#!后面没有可执行程序名,shell 将报告一个错误,通知没有找到用户要求运行的命令。在#!后面可以有一些空格。如果忽略#!那一行而试图运行脚本,比如从 bash中运行 tcsh 脚本,shell 将产生错误消息或者脚本执行不正确。参见第 13.5 节中的一个独立的 sed 脚本,它用到了#!。3.#开始一行注释 使用注释可使 shell 脚本和程序便于自己和他人阅读和维护。Bourne Again shell 和TC Shell 的注释语法相同。如果#号(#)在脚本的第 1 行出现并且其后没有感叹号!,或者脚本中其他任意位置上出现了#,那么 shell 将其视为注释的开始。shell 将忽略#到该行末(下一个换行符)之间的所有内容。4.执行 shell 脚本 fork 和 exec 系统调用 用户在命令行上输入一条命令之后,shell 将 fork 一个新的进程,以创建当前 shell 进程的一个副本(子 shell)。这个新的进程将试图 exec(execute,执行)该命令。与 fork 一样,exec 例程也是由操作系统执行(系统调用)。如果该命令是一个二进制可执行程序,比如编译好的 C 程序,那么 exec 执行成功,系统使用该可执行程序覆盖新创建的子 shell。而如果这个命令是一个 shell 脚本,exec 执行失败。当 exec 失败时,将会假设该命令是一个 shell 脚本,子 shell 将执行脚本中的命令。与登录 shell 期望从命令行读取输入不同,子 shell 从文件(shell 脚本)中获取输入。如前所述,如果不具备 shell 脚本文件的执行权限,那么,用户可以使用 bash 命令来 exec 一个 shell 直接运行该脚本,这样就可以运行脚本中的命令。在下面的示例中,bash 创建了一个新的 shell,它从名为 whoson 的文件中获取输入:第部分 shell 232$bash whoson 因为 bash 命令期望读取一个包含命令的文件,所以不需要 whoson 的执行权限(但仍然需要读权限)。即便 bash 从 whoson 中读取并执行命令,标准输入、标准输出和标准错误输出仍然连接到终端。尽管可以使用 bash 执行脚本,但这项技术将会使脚本的执行速度要比具备执行权限之后直接调用脚本慢一些。用户更喜欢将文件改为可执行并在命令行上直接输入文件名来运行脚本。而且输入名字更加容易一些,这和调用其他类型的程序的实践经验是一致的,这样用户就没有必要知道正在运行的是一个 shell 脚本还是其他类型的程序。然而,如果 bash 并不是用户所用的交互式 shell 或者想看看不同 shell 如何执行该脚本,那么就可将脚本作为 bash 或者 tcsh 的参数。sh 不能调用原 Bourne Shell 警告警告 用命令 sh 调用原 Bourne Shell。尽管可以在 sh 命令中调用 bash,但它不是原 Bourne Shell。sh 命令(/bin/sh)为/bin/bash 的符号链接,因此它仅仅是 bash 命令的另一个名字而已。当使用命令 sh 来调用 bash 时,bash 试图尽可能地模仿原 Bourne Shell的行为。但是这并不总能够成功。8.2.5 命令分隔和命令分组 当用户交互地向 shell 输入命令时,或者在编写 shell 脚本时,必须分隔不同的命令。本节将首先回顾第 5 章所讲的命令分隔方法,还介绍了几个新的方法。本节适用于 Bourne Again 和 TC Shell。1.使用;和换行符分隔命令 换行符是一个独特的命令分隔符,因为它将启动该字符前面的命令执行。在阅读本书过程中,每次在命令行末尾输入 RETURN 键的时候,都会遇到这种情形。分号;也是一种命令分隔符,但是它并不立即启动命令执行,也不改变命令的任何功能。用户可以在单独一个命令行中连续地输入一串命令,并用分号;彼此分开。通过输入RETURN 键启动这串命令:$x;y;z 对于命令 x、y 和 z,这个命令行产生的结果与下面示例的中 3 个命令产生的结果相同。不同之处在于,下面的示例中,每个命令(x、y 和 z)执行完毕之后,shell 均发出一个提示符,而前面的示例中 shell 仅仅在 z 执行完毕之后才发出提示符。$x$y$z 空格符 尽管前面的示例中,分号;左右都有空格符使得命令行更加便于阅读,但是 第 8 章 Bourne Again Shell 233 这些空格符并不是必需的。任何命令分隔符左右均不需要空格或者制表符。2.继续命令 当输入一个比较长的命令行时,光标已经到达屏幕右端,这时候可以使用反斜杠字符在下一行继续这条命令。反斜杠引用了换行符(也就是将其转义),这样 shell 就不会将这个换行符作为一个命令终结符对待。用单引号将反斜杠字符括起来,就可以关闭反斜杠字符转义特殊字符(如换行符)的功能。而用双引号括起来不会影响反斜杠字符的这个功能。尽管可以在一个字(记号)中间进行换行,但是一般情况下,在空格符前或后换行更便于阅读。选读 在命令行中,可以在引用串中间输入 RETURN 符而不用使用反斜杠字符。此时输入的换行符(RETURN)将成为这个字符串的一部分:$echo Please enter the three values required to complete the transaction.Please enter the three values required to complete the transaction.在本节的 3 个示例中,shell 并没有将 RETURN 解释为命令终结符,因为它出现在引用串中间。字符是一个辅助提示符,指出 shell 正等待用户继续输入尚未完成的命令。在下一个示例中,第 1 个 RETURN 被引用(转义),这样 shell 将其作为一个分隔符,并不做字面解释。$echo Please enter the three values required to complete the transaction.Please enter the three values required to complete the transaction.而单引号使得 shell 照字面解释反斜杠字符:$echo Please enter the three values required to complete the transaction.Please enter the three values required to complete the transaction.3.|和&分隔命令及其他功能 管道符号|和后台任务符号&也是命令分隔符。它们并不开始执行命令而是在某些方面改变命令的功能。管道符号改变标准输入的源或者是标准输出的目的地。而后台任务符号使 shell 在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。下面每个命令行都启动了一个由 3 个任务组成的作业:S x|y|z 第部分 shell 234$1s-1|grep tmp|less 在第 1 个作业中,shell 将任务 x 的标准输出重定向到任务 y 的标准输入,同时还将y 的标准输出重定向到 z 的标准输入。因为整个作业均在前台执行,所以在任务 z 运行完毕之前 shell 不会显示提示符:在任务 y 结束之前 z 不会结束,而在 x 结束之前 y 不会结束。在第 2 个作业中,任务 x 是 ls-l 命令,任务 y 是 grep tmp,任务 z 是分页实用程序 less。shell 显示当前工作目录下面包含字符串 tmp 的文件列表,通过管道传给 less。下一个命令行在后台执行任务 d 和 e,而在前台执行任务 f:$d&e&f 1 14271 2 14272 shell 将作业数目显示在方括号 中,同时还显示了在后台运行的每个进程的PID(process identification,进程标识)编号。在 f 结束后就会立即得到一个 shell 提示符,此时 d 或者 e 还可能尚未执行完毕。在显示提示符以接受新的命令之前,shell 检查后台运行的作业是否完成。每完成一个作业,shell 均显示其作业编号、字 Done 以及调用该作业的命令行,然后 shell 才会给出一个提示符。在列出作业编号时,最后一个开始的作业的编号后面将跟着一个字符+,而前一个作业的编号后面会跟着一个字符-。任何其他作业列出时有一个空格符。在运行最后一条命令后,shell 在给出提示符之前将显示下面的内容:1-Done d 2+Done e 下面的命令行将在后台执行所有 3 个作业。这时用户将立即得到一个提示符:$d&e&f&1 14290 2 14291 3 14292 可用管道将一个任务的输出发送给下一个任务,并用&将整个作业作为一个后台任务运行。这时提示符也会立即出现。shell 会将通过管道连接的多个命令当作一个单独的作业。也就是说,它将管道视为单独的任务,而不管管道符号|连接的任务数量或者这些任务有多么复杂。Bourne Again Shell 显示了仅有一个进程在后台执行的情形:$d|e|f&1 1429

    注意事项

    本文(Linux命令、编辑器与Shell编程08.pdf)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开