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 (从系统喇叭送出铃声)
\b: BACKSPACE ,也就是向左删除键
\c:取消行末之换行符号
\E: ESCAPE,跳脱键
\f: FORMFEED,换页字符
\n: NEWLINE,换行字符
\r: RETURN,回车键
\t: TAB,表格跳位键
\v: VERTICAL TAB,垂直表格跳位键
\n: 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 键亦然。
Shell十三问[转]的更多相关文章
- shell十三问
1) 为何叫做 shell ?在介绍 shell 是甚幺东西之前,不妨让我们重新检视使用者与计算机系统的关系:图(FIXME)我们知道计算机的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱 ...
- shell十三问:关于${0##*/} 和${0%/*}
转自shell十三问: http://bbs.chinaunix.net/thread-218853-1-1.html …… 假設我們定義了一個變量為:file=/dir1/dir2/dir3/my ...
- 转:shell 经典, shell 十三问
原文链接:http://blog.csdn.net/freexploit/article/details/626660 我在 CU 的日子并不长,有幸在 shell 版上与大家结缘.除了跟众前辈学 ...
- 《Shell十三问》笔记(下)
继续开始shell十三问中11-13问和后续补充的笔记,加油! (14)输入重定向与输出重定向 “>”是标准输出重定向,可以把输出结果送入文件 “<”是标准输入重定向,可以重新指定文件的内 ...
- 《Shell十三问》笔记(上)
<shell十三问>是网中人前辈首发在CU论坛上对SHELL的一些整理,非常值得一读 注:笔记的标号非问题标号,而是知识点的标号.本篇笔记记录的是1-10问的知识点 (1)IFS:Shel ...
- shell十三问?
shell 十三问: 1) 为何叫做 shell ? 2) shell prompt(PS1) 与 Carriage Return(CR) 的关系? 3) 别人 echo.你也 echo ,是问 ...
- shell 十三问
经典的Shell十三问 摘选整理自:http://bbs.chinaunix.net/thread-218853-1-1.htmlhttps://github.com/wzb56/13_questio ...
- [^ ] 跟 [! ] 差在哪?-- Shell十三问<第十四问>
[^ ] 跟 [! ] 差在哪?-- Shell十三问<第十四问> 这道题目说穿了, 就是要探讨 Wildcard(通配符)与 Regular Expression(正则表达式)的差别的. ...
- for what? while 与 until 差在哪?-- Shell十三问<第十三问>
for what? while 与 until 差在哪?-- Shell十三问<第十三问> 最后要介绍的是 shell script 设计中常见的"循环"(loop). ...
随机推荐
- jQuery-1.9.1源码分析系列(十) 事件系统——事件体系结构
又是一个重磅功能点. 在分析源码之前分析一下体系结构,有助于源码理解.实际上在jQuery出现之前,Dean Edwards的跨浏览器AddEvent()设计做的已经比较优秀了:而且jQuery事件系 ...
- 微服务(Microservices)——Martin Flower【翻译】
原文是 Martin Flower 于 2014 年 3 月 25 日写的<Microservices>. 本文内容 微服务 微服务风格的特性 组件化(Componentization ) ...
- 在 .NET 中远程请求 https 内容时,发生错误:根据验证过程,远程证书无效。
当访问 https 内容的时候,有时候经常会看到证书错误(不在操作系统的证书信任链中?)的提示,在浏览器中我们可以忽略错误的证书,继续访问网页内容. 但是在 .NET 程序中,需要由代码来判断是否忽略 ...
- jQuery获取Select选中的Text和Value
获取Select选中的Text和Value语法解释:$("#select_id").change(function(){//code...}); // 为Select添加事件, ...
- 详解Spring框架AOP(面向切面编程)
最近在学习AOP,之前一直很不明白,什么是AOP?为什么要使用AOP,它有什么作用?学完之后有一点小小的感触和自己的理解,所以在这里呢就跟大家一起分享一下 AOP(Aspect-Oriented Pr ...
- SQL Server帐号孤立的问题解决
网站近日经常遭到攻击,好几次数据库挂马,前几天把论坛升级了,今天又升级了数据库,把之前的MSSQL 2000 升级到MSSQL 2005,用的是数据库还原功能还原的,遇到了这个帐号孤立的问题. 什么是 ...
- Entity Framework 代码先行
一.什么是Code First 为了支持以设计为中心的开发流程,EF还更多地支持以代码为中心 (code-centric) ,我们称为代码优先的开发,代码优先的开发支持更加优美的开发流程,它允许你在不 ...
- Debian 7 安装配置总结
最近几天折腾了一下Debian 7 (gnome桌面DVD版,KDE桌面CD版最后会提到),总的来说收获还是挺大的,对比以前使用ubuntu,debian 7给我的感觉像是一个新生婴儿,不带多余的花俏 ...
- 从零开始学Python06作业源码(仅供参考)
Python Version 2.7x 一,bin目录:程序启动入口 SelectLesson_start.py #!usr/bin/env python # -*- coding:utf-8 -*- ...
- JAVA 8 Streams
什么是Stream 首先要说的是,不要被它的名称骗了,这里的Stream跟JAVA I/O中的InputStream和OutputStream是两个不同的概念.Java 8中的Stream其实是函数式 ...