• Shell十三问[转]


    Shell十三问


    转载于网络,稍加整理。

    (一) 为何叫做Shell?

    我们知道计算机的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱动只能透过一个称为"操作系统(Operating System)"的软件来控管,事实上, 我们每天所谈的linux , 严格来说只是一个操作系统, 我们称之为"核心(kernel)"。然而,从使用者的角度来说,使用者也没办法直接操作 kernel ,而是透过 kernel 的"外壳"程序,也就是所谓的 shell ,来与 kernel 沟通。这也正是 kernel 跟 shell 的形像命名关系。

    从技术角度来说, shell 是一个使用者与系统的互动界面(interface),主要是让使用者透过命令行(command line)来使用系统以完成工作。因此, shell 的最简单的定义就是---命令解译器(Command Interpreter)

    • 将使用者的命令翻译给核心处理,
    • 同时,将核心处理结果翻译给使用者

    每次当我们完成系统登入(log in), 我们就取得一个互动模式的 shell , 也称为 login shell或 primary shell。
    若从进程(process)角度来说,我们在 shell 所下达的命令,均是 shell 所产生的子进程。这现像,我们暂可称之为 fork 。
    如果是执行脚本(shell script)的话,脚本中的命令则是由另外一个非互动模式的子 shell(sub shell)来执行的。
    也就是 primary shell 产生 sub shell 的进程, sub shell 再产生 script 中所有命令的进程。

    (二) shell prompt(PS1) 与 Carriage Return(CR) 的关系?

    当你成功登录进一个文字界面之后,大部份情形下,你会在荧幕上看到一个不断闪烁的方块或底线(视不同版本而别),我们称之为游标(coursor)
    游标的作用就是告诉你接下来你从键盘输入的按键所插入的位置,且每输如一键游标便向右边移动一个格子,若连续输入太多的话,则自动接在下一行输入。
    假如你刚完成登录还没输入任何按键之前,你所看到的游标所在位置的同一行的左边部份,我们称之为提示符号(prompt)。
    提示符号的格式或因不同系统版本而各有不同,在 Linux 上,只需留意最接近游标的一个可见的提示符号,通常是如下两者之一:
    $:给一般使用者帐号使用
    #:给 root (管理员)帐号使用

    事实上, shell prompt 的意思很简单:

    • 是 shell 告诉使用者:您现在可以输入命令行了。

    我们可以说,使用者只有在得到 shell prompt 才能打命令行,而 cursor 是指示键盘在命令行所输入的位置,使用者每输入一个键, cursor 就往后移动一格,直到碰到命令行读进 CR(Carriage Return,由 Enter 键产生)字符为止。
    CR 的意思也很简单:

    • 是使用者告诉 shell:老兄你可以执行我的命令行了。

    严格来说,所谓的命令行,就是在 shell prompt 与 CR 字符之间所输入的文字。

    系统可接受的命令名称(command-name)可以从如下途径获得:

    • 明确路径所指定的外部命令
    • 命令别名(alias)
    • 自定功能(function)
    • shell 内建命令(built-in)
    • $PATH 之下的外部命令

    每一个命令行均必须含用命令名称,这是不能缺少的。

    echo知多少?

    echo 是一个非常简单、直接的 Linux 命令:
    将 argument 送出至标准输出(STDOUT),通常就是在监视器(monitor)上输出。

    先运行一下echo命令:

    $ echo
    
    $
    

    会发现只有一个空白行,然后又回到 shell prompt 上了。
    这是因为 echo 在预设上,在显示完 argument 之后,还会送出一个换行符号(new-line
    charactor)。
    但是上面的 command 并没任何的 argument ,那结果就只剩一个换行符号了...
    若你要取消这个换行符号,可利用 echo-n option

    $ echo -n
    $
    

    要想看看 echo 的 argument ,可试试如下的输入:

    $ echo hello
    hello
    $ echo -n hello
    hello$
    

    上两个 echo 命令中,你会发现 argument 的部份显示在你的荧幕,而换行符号则视 -n option 而定。
    很明显的,第二个 echo 由于换行符号被取消了,接下来的 shell prompt 就接在输出结果同
    一行了。

    事实上, echo 除了 -n options 之外,常用选项还有:

    -e :启用反斜线控制字符的转换
    -E:关闭反斜线控制字符的转换
    -n :取消行末之换行符号
    

    关于 echo 命令所支持的反斜线控制字符如下表:

    a: ALERT / BELL (从系统喇叭送出铃声)
    : BACKSPACE ,也就是向左删除键
    c:取消行末之换行符号
    E: ESCAPE,跳脱键
    f: FORMFEED,换页字符
    
    : NEWLINE,换行字符
    
    : RETURN,回车键
    	: TAB,表格跳位键
    v: VERTICAL TAB,垂直表格跳位键
    
    : ASCII 八进位编码(以 x 开首为十六进制)
    \:反斜线本身
    

    (四) " "‘ ’的区别?

    经过前面两章的学习,应该很清楚当你在 shell prompt 后面敲打键盘、直到按下 Enter 的时
    候,你输入的文字就是 command line 了,然后 shell 才会以行程的方式执行你所交给它的命令。
    但是,在 command line 输入的每一个文字,对 shell 来说,是有类别之分的!
    简单而言, command line 的每一个 charactor ,分为如下两种:

    • literal:也就是普通纯文字,对 shell 来说没特殊功能。
    • meta:对 shell 来说,具有特定功能的特殊保留字符。

    Literal 没甚么好谈的,凡举 abcd、 123456 这些"文字"都是 literal ,但 meta 却常使我们困惑。
    事实上,前两章我们在 command line 中已碰到两个机乎每次都会碰到的 meta :

    • IFS:由 <space><tab><enter> 三者之一组成(我们常用 space )。
    • CR:由 <enter> 产生。

    IFS 是用来拆解 command line 的每一个词(word)用的,因为 shell command line 是按词来处理的。
    而 CR 则是用来结束 command line 用的,这也是为何我们敲 命令就会跑的原因。
    除了 IFS 与 CR ,常用的 meta 还有:

    = 	: 设定变量。
    $ 	: 作变量或运算替换(请不要与 shell prompt 搞混了)。
    >   :重导向 stdout。
    < 	:重导向 stdin。
    |	:命令管线。
    & 	:重导向 file descriptor ,或将命令置于背境执行。
    ( )	:将其内的命令置于 nested subshell 执行,或用于运算或命令替换。
    { }	:将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。
    ; 	:在前一个命令结束时,而忽略其返回值,继续执行下一个命令。
    && 	:在前一个命令结束时,若返回值为 true,继续执行下一个命令。
    || 	:在前一个命令结束时,若返回值为 false,继续执行下一个命令。
    !	:执行 history 列表中的命令
    

    假如我们需要在 command line 中将这些保留字符的功能关闭的话,就需要 quoting 处理了。在 bash 中,常用的 quoting 有如下三种方法:

    • hard quote: ' ' (单引号),凡在 hard quote 中的所有 meta 均被关闭。
    • soft quote: " " (双引号),在 soft quoe 中大部份 meta 都会被关闭,但某些则保留(如$ )。
    • escape : (反斜线),只有紧接在 escape (跳脱字符)之后的单一 meta 才被关闭。

    下面的例子将有助于我们对 quoting 的了解:

    $ A=B C # 空格键未被关掉,作为 IFS 处理。
    $ C: command not found.
    $ echo $A
    $
    $ A="B C" # 空格键已被关掉,仅作为空格键处理。
    $ echo $A
    B C
    

    在第一次设定 A 变量时,由于空格键没被关闭, command line 将被解读为:

    • A=B 然后碰到<IFS>,再执行 C 命令。在第二次设定 A 变量时,由于空格键被置于 soft quote 中,因此被关闭,不再作为 IFS :
    • A=B<space>C

    空格键无论在 soft quote 还是在 hard quote 中,均会被关闭。 Enter 键亦然。

    越努力越幸运。
  • 相关阅读:
    ioremap函数
    kmalloc、kzalloc和vmalloc
    C语言 snprintf函数
    C语言 memset函数
    消息队列
    mount -a
    linux系统查看服务状态和启动停止服务
    Java中创建对象的内存图
    Java中数组在内存中的图解
    socket编程(Java实现)
  • 原文地址:https://www.cnblogs.com/chownjy/p/6097113.html
Copyright © 2020-2023  润新知