第十一章、认识与学习 BASH
最近升级日期:2009/08/25

大标题的图示重点回顾
  • 由于核心在内存中是受保护的区块,因此我们必须要透过『 Shell 』将我们输入的命令与 Kernel 沟通,好让 Kernel 可以控制硬件来正确无误的工作
  • 学习 shell 的原因主要有:文字接口的 shell 在各大 distribution 都一样;远程管理时文字接口速度较快; shell 是管理 Linux 系统非常重要的一环,因为 Linux 内很多控制都是以 shell 撰写的。
  • 系统合法的 shell 均写在 /etc/shells 文件中;
  • 用户默认登陆取得的 shell 记录于 /etc/passwd 的最后一个字段;
  • bash 的功能主要有:命令编修能力;命令与文件补全功能;命令别名配置功能;工作控制、前景背景控制;程序化脚本;通配符
  • type 可以用来找到运行命令为何种类型,亦可用于与 which 相同的功能;
  • 变量就是以一组文字或符号等,来取代一些配置或者是一串保留的数据
  • 变量主要有环境变量与自定义变量,或称为全局变量与局部变量
  • 使用 env 与 export 可观察环境变量,其中 export 可以将自定义变量转成环境变量;
  • set 可以观察目前 bash 环境下的所有变量;
  • $? 亦为变量,是前一个命令运行完毕后的回传值。在 Linux 回传值为 0 代表运行成功;
  • locale 可用于观察语系数据;
  • 可用 read 让用户由键盘输入变量的值
  • ulimit 可用以限制用户使用系统的资源情况
  • bash 的配置文件主要分为 login shell 与 non-login shell。login shell 主要读取 /etc/profile 与 ~/.bash_profile, non-login shell 则仅读取 ~/.bashrc
  • 通配符主要有: *, ?, [] 等等
  • 数据流重导向透过 >, 2>, < 之类的符号将输出的信息转到其他文件或装置去;
  • 连续命令的下达可透过 ; && || 等符号来处理
  • 管线命令的重点是:『管线命令仅会处理 standard output,对于 standard error output 会予以忽略』 『管线命令必须要能够接受来自前一个命令的数据成为 standard input 继续处理才行。』
  • 本章介绍的管线命令主要有:cut, grep, sort, wc, uniq, tee, tr, col, join, paste, expand, split, xargs 等。

大标题的图示本章习题
( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
  • 情境模拟题一:由于 ~/.bash_history 仅能记录命令,我想要在每次注销时都记录时间,并将后续的命令 50 笔记录下来, 可以如何处理?

    • 目标:了解 history ,并透过数据流重导向的方式记录历史命令;
    • 前提:需要了解本章的数据流重导向,以及了解 bash 的各个环境配置文件信息。

    其实处理的方式非常简单,我们可以了解 date 可以输出时间,而利用 ~/.myhistory 来记录所有历史记录, 而目前最新的 50 笔历史记录可以使用 history 50 来显示,故可以修改 ~/.bash_logout 成为底下的模样:
    [root@www ~]# vim ~/.bash_logout
    date >> ~/.myhistory
    history 50 > > ~/.myhistory
    clear
    


简答题部分:
  • 在 Linux 上可以找到哪些 shell(举出三个) ?那个文件记录可用的 shell ?而 Linux 默认的 shell 是?
    1) /bin/bash, /bin/tcsh, /bin/csh
    2) /etc/shells
    3) bash ,亦即是 /bin/bash。
  • 在 shell 环境下,有个提示字符 (prompt),他可以修改吗?要改什么?默认的提示字符内容是?
    可以修改的,改 PS1 这个变量,这个 PS1 变量的默认内容为:『[\u@\h \W]\$』
  • 如何显示 HOME 这个环境变量?
    echo $HOME
  • 如何得知目前的所有变量与环境变量的配置值?
    环境变量用 env 或 export 而所有变量用 set 即可显示
  • 我是否可以配置一个变量名称为 3myhome ?
    不行!变量不能以数字做为开头,参考变量配置守则的内容
  • 在这样的练习中『A=B』且『B=C』,若我下达『unset $A』,则取消的变量是 A 还是 B?
    被取消的是 B 喔,因为 unset $A 相当于 unset B 所以取消的是 B ,A 会继续存在!
  • 如何取消变量与命令别名的内容?
    使用 unset 及 unalias 即可
  • 如何配置一个变量名称为 name 内容为 It's my name ?
    name=It\'s\ my\ name 或 name="It's my name"
  • bash 环境配置文件主要分为哪两种类型的读取?分别读取哪些重要文件?
    (1)login shell:主要读取 /etc/profile 及 ~/.bash_profile
    (2)non-logni shell:主要读取 ~/.bashrc 而已。
  • CentOS 5.x 的 man page 的路径配置文件案?
    /etc/man.config
  • 试说明 ', ", 与 ` 这些符号在变量定义中的用途?
    参考变量守则那一章节,其中, " 可以具有变量的上下文属性,' 则仅有一般字符,至于 ` 之内则是可先被运行的命令。
  • 跳脱符号 \ 有什么用途?
    可以用来跳脱特殊字符,例如 Enter, $ 等等,使成为一般字符!
  • 连续命令中, ;, &&, || 有何不同?
    分号可以让两个 command 连续运行,不考虑 command1 的输出状态, && 则前一个命令必需要没有错误信息,亦即回传值需为 0 则 command2 才会被运行, || 则与 && 相反!
  • 如何将 last 的结果中,独立出账号,并且印出曾经登陆过的账号?
     last | cut -d ' ' -f1 | sort | uniq
  • 请问 foo1 && foo2 | foo3 > foo4 ,这个命令串当中, foo1/foo2/foo3/foo4 是命令还是文件? 整串命令的意义为?
    foo1, foo2 与 foo3 都是命令, foo4 是装置或文件。整串命令意义为:
    (1)当 foo1 运行结果有错误时,则该命令串结束;
    (2)若 foo1 运行结果没有错误时,则运行 foo2 | foo3 > foo4 ;其中:
    (2-1)foo2 将 stdout 输出的结果传给 foo3 处理;
    (2-2)foo3 将来自 foo2 的 stdout 当成 stdin ,处理完后将数据流重新导向 foo4 这个装置/文件
  • 如何秀出在 /bin 底下任何以 a 为开头的文件文件名的详细数据?
    ls -l /bin/a*
  • 如何秀出 /bin 底下,文件名为四个字符的文件?
    ls -l /bin/????
  • 如何秀出 /bin 底下,档名开头不是 a-d 的文件?
    ls -l /bin/[^a-d]*
  • 我想要让终端机接口的登陆提示字符修改成我自己喜好的模样,应该要改哪里?(filename)
    /etc/issue
  • 承上题,如果我是想要让使用者登陆后,才显示欢迎信息,又应该要改哪里?
    /etc/motd

大标题的图示参考数据与延伸阅读

 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室