「Chapter 06」- 分词(现在分词、过去分词)

传统语法所谓的动状词(Verbals)包含前两章处理过的不定词、动名词。另外是两种分词(现在分词、过去分词)可视为形容词。甚至在出现于被动态、进行式的时候,仍然可以把过去分词、现在分词视为形容词。当然严格说来,这种看法在语言学的区分上并不十分严谨。可是,就一般语言学习者而言,把分词一律视为形容词可收驾简驭繁的效果,仍不失为值得推广的观念。尤其是进入复杂的简化从句化(Reduction)时,这种观念可以使句型诠释较统一、句型变化较灵活,所以笔者大力主张把分词一律视为形容词。
分词 vs 形容词
形容词是用来形容名词的,在句中有两种位置:

(1)名词短语中
(2)补语位置

这两个位置都可以放分词来取代形容词,同样达到修饰名词的目的。
一、现在分词与形容词的关系
That black dog doesn’t bite.(那只黑狗不咬人) A barking dog doesn’t bite.(爱叫的狗不咬人)
在这两个名词短语中,现在分词 barking 与普通形容词 black 一样放在名词短语中间,一样用来修饰名词 dog,所以都可以当做形容词看待。只不过 barking 这个现在分词要加上进行的暗示,解释为“正在叫的,一直叫的”,这个进行的暗示(“正在”、“一直”)就可以视为现在分词 -ing 字尾的弦外之音。许多形容词字尾都有它的弦外之音,像是 -fill(“很”,full of),例如 useful;再如 -ish(一点),例如 grayish;以及 -less(没、不),例如 valueless。同样的, -ing 也可以视为形容词字尾,弦外之音是“正在”、“一直”。
The dog is black.(那是只黑狗) The dog is barking.(那只狗在叫)
现在分词 barking 和普通形容词 black 都出现于 be 动词后面,都可以视为补语,形容主语 dog,只不过现在分词 -ing 字尾要加上进行的暗示。当然,一般语法说 be+Ving 是进行式的动词短语。可是,并不是 is barking 才能解释为进行意义的“正在叫”。a barking dog 不也一样是“正在叫”的狗吗?所以,还是把 barking 一律解释为形容词比较有一致性。
二、过去分词与形容词的关系
过去分词与现在分词一样,可以岀现在两种形容词位置来形容名词,不过它的弦外之音是被动或完成的暗示,要加上”被”、“已经”来解释。
Clean water is safe to drink.(干净水可以安全饮用) Boiled water is safe to drink.(开水可以安全饮用)
过去分词 boiled 和形容词 clean 同样放在[……]

READ MORE

「Chapter 07」- 形容词

英语的修饰语有两种词类:形容词和副词。形容词是修饰名词用的。副词则用来修饰名词以外的词类,包括动词、形容词与其他副词。当然,也有些特别的副词可以用来修饰名词,这一点留待以后谈到副词部分时再来讨论。大致说来,形容词是可以定义为修饰名词的修饰语。
广义的形容词包括形容词从句、简化形容词从句(包含分词短语、同位语、不定词)、介系词语、复合词及单词等等。本章的内容以单词形状的形容词为主,其余的留待将来在相关章节中分别叙述。单词形状的形容词,通常在句子中只有两种位置可能出现:名词短语中以及补语位置。
在名词短语中的形容词
这类形容词一般是出现在限定词(像 a、the、this、some, five、John’s 等词)与名词中间。请观察以下的名词短语以及其中的形容词:

限定词 形容词 名词
three yellow roses (三朵黄玫瑰)
a new camera (一架新相机)
my best friend (我最好的朋友)

dirty water (脏水)
pretty women (漂亮女人)

这种形容词英语称为 attributive adjectives,是用来表示该名词属性(attribute)的形容词,这一点稍后再详述。
一、放在名词后面的形容词
有些特别的形容词出现在名词短语中时,不放在中间,却要放在名词后面。例如:

Someone else will have to do it.(另外要有人去做这事)

I don’t know anybody else.(我不认识别的人)

else 这个形容词的用法是配合像 someone,anybody 等的复合名词来使用。因为限定词的 some、any 已经和名词的 one、body 写在一起,所以中间的形容词位置被挤掉了,else 这个形容词就只能放到名词后面去了。
另外,有些 a- 开头的古英语形容词,除了可以放在补语位置外,如要用在名词短语中,也只能放在名词后面。这是因为古英语 a- 的词首代表一种暂时性的状态,类似拉丁文 -ing 词尾的味道。因而这类形容词不适合放在名词语中间代表属性(attribute)的位置。例如:

John and his brother alike are unreliable.(约翰和他弟弟都不可靠)

Money alone cannot solve our problem.(光靠钱解决不了我们的问题)

alike 和 alone 这两个 a- 开头的古英语都不适合放入名词短语中,只能放在后面。alone[……]

READ MORE

「 Chapter 08」- 副词

八大词类当中,属于修饰语性质的有形容词和副词两种。这两种词类之间的分工,在语法书中都是说形容词用来修饰名词,而副词用来修饰名词以外的词类(包括动词、形容词与副词)。这个区分大致说来成立。可是,如果要求比较周延一点,就知道有若干种副词其实也可以用来修饰名词类。例如:

Vegetables, especially spinach, are good for you.(蔬菜,尤其是菠菜,有益健康)

这个例子当中就是用副词类的 especially 来修饰名词类的 spinach。要了解这些变化,就得很清楚认识副词的分类。
副词另一个要注意的问题是它在句子中的位置。一般说来,副词的位置很有弹性,但也不是没有章法。不同种类的副词在句子当中会有不同的位置。所以,要了解副词的位置,避免在写作时出错,仍然得对副词的分类有清楚的认识。以下就来看看副词有哪几种,以及各种副词之间位置的变化。
方法、状态的副词(Adverbs of Manner)
修饰词类:这类副词是修饰动词专用的,典型的拼法是形容词加上 -ly 字尾。
使用位置:既然它是修饰动词的,那么原则上它的位置应该尽量和动词接近,通常是放在动词后面的位置。可是,副词是修饰语,属于比较不重要的元素,如果在句中有宾语、补语等主要元素存在时,方法、状态的副词就要向后挪,让宾语、补语等元素先出来。假如后移的结果造成副词与它所修饰的动词之间距离太远,那么也可以另辟蹊径,把方法、状态的副词调到动词前面的位置去,以维持修饰语必须和它所修饰的对象接近的原则。
以下分别就五种基本句型举例说明。
一、S+V
例:The child[S] giggled[V] happily(adv.) under the caress of its mother.(小孩在母亲抚摸下笑得很开心)
介系词短语 under the caress 在此先不讨论,留待后面章节来解说。本句中动词 giggled 之后已无主要元素存在,所以修饰动词的 happily 可以直接放在动词后面。如果 happily 放在动词前面,成为:

The child happily giggled….

仍然是正确的句子。在动词前面,也是紧邻动词的位置,所以符合修饰语要与修饰对象接近的原则。但方法、状态的副词,除非有特殊原因,还是放在动词后面为佳,因为动词是主要元素,先出来会比较清楚。
二、S+V+C
例:He[S] kept[V] quiet[C] resolutely(adv.).(他坚定地保持沉跌)
补语 quiet 是主要元素,要先出来,所以修饰动词的副词 resolutely 就被挤到后面去了。请注意,如果把 resol[……]

READ MORE

「Chapter 09」

内容简介[……]

READ MORE

「 Chapter 10」- 介系词

在英语语法中,介系词可以说是最简单、也可以说是最难的东西:

说它简单,是因为它没有什么观念可言,不像时态、语气、句型等,要求系统性的理解,所以在介系词的部分,不会有“不懂”的问题。

然而介系词之难,也就难在它缺乏观念性,不能以一套观念来涵盖所有介系词的用法。英语中的介系词虽然没有多少个,可是在短语中的用法却变化多端。就算有多年英语写作经验的人,也可能用错。

所以我们可以这样说:介系词的用法,比较接近单词、短语的问题,而不大属于语法的问题。
要想彻底了解介系词的用法,最确实的方法是经由泛读来解决:培养阅读的习惯,快速、大量、持续地阅读英语作品,例如把每个月的《Time 中文解读版》从头到尾看完。只要看过各种介系词的用法,阅读过无数的例子,假以时日,就会形成一些“感觉”。拿起笔来写英语,自然可判断在哪个句子中该用哪个介系词。其实不仅介系词如此,单词与语法句型的问题也都应该配合泛读来吸收大量的、反复的 input,才能真正解决。
本章中,笔者将整理一些有关介系词方面的基本观念,作为帮助读者判断介系词的依据。然后再把一些容易用错的介系词挑选出来,分别做一些比较与说明,尤其针对坊间语法书有误,或是语焉不详的地方加以澄清。除此之外,笔者并不企图完整地介绍所有介系词的用法(事实上也不可能)。所附的练习,有些可能会超出本单元探讨的范围,读者不妨配合答案做做看,多练习一些介系词的用法。
介系词短语
所谓“介系词短语”,就是由介系词加上一个名词短语所构成的意义单元,在句中常被当做修饰语(形容词短语或副词短语),用来修饰名词、动词、形容词与副词等各种词类。它的位置通常是在所修饰的对象后面。例如:

Cherries[名词] are in season now[介系词短语].(现在正是樱桃盛产的季节)

Eggs are sold[动词] by the dozen[介系词短语].(鸡蛋是论打出傳的)

The box is full[形容词] of chocolates[介系词短语].(盒子里装满了巧克力)

He’ll return tomorrow[副词] at the latest[介系词短语].(他最晚明天回来)

空间的介系词
语言学家 R.C.Close 在《A Reference Grammar》一书中,将表示空间的介系词做出一套可资参考的整理。他把这种介系词分为点、线、面、体四类来探讨:
―、点:at
例:Let’s meet at the railway station.(我们火车站见)
火车站虽然是立体的建筑,可是用在这句[……]

READ MORE

「Chapter 11」

内容简介[……]

READ MORE

「PART 2」- 复句与合句(Complex Sentences and Compound Sentences)

自本章起本书告别简单句,进入较复杂的复句、合句结构,开始探讨怎样把两个简单句写在一起。
何谓合句?
如果是两个各自能够独立的简单句,中间以 and、but、or 等连接词连起来,两句之间维持平行、对称的关系,没有主、从之分,就称为合句(Compound Sentence)又称对等从句。
例如:

Girls like dolls, but boys like robots.(女生喜欢洋蛙娃,男生喜欢机器人。)

一个合句,只要当成两个简单句来解释就好了,两句之间互为对等从句,关系十分单纯,不须多加解释。只有在省略时要注意对等从句之间对称的要求,这点留待第十五章再加以详述。
何谓复句?
如果将一个句子改造成名词、形容词或副词类,放到另一句中使用,合并而成的句子有主从之分,就称为复句(Complex Sentence)。被改造的句子称为从属从句,另一句则称为主要从句。
复句的从属从句有三种,分别是名词从句、形容词从句和副词从句,各有其特色,在此先看一些简单例子的说明:
一、名词从句

I[S] know[V] something[O].

I[S] am[V] right[O].

=> I[S] know[V] that I am right[O].(我知道我是对的。)
I am right 是一个独立的简单句,外加连接词 that 成为名词从句,放在主要从句中当做 know 的宾语。
二、形容词从句

My father is a man.

He always keeps his word.

=> My father is a man[C] who always keeps his word[修饰前面的 a man].(我父亲是个信守诺言的人。)
形容词从句又称关系从句。两个各自独立的简单句之间必须要有关系,也就是要有一个重复的元素存在。上例中,例1与例2即因为 a man 和 he 的重复而建立关系,再将重复点的 he 改写成关系词 who,就可以将两句连在一起了。who always keeps his word 用来形容前面的名词 man,所以称为形容词从句。
三、副词从句

He works hard.

He’s in need of money.

=> He works hard because he’s in need of money[修改前面的 works].(他勤奋工作,因为他需要钱。)
这是最简单的一种从属从[……]

READ MORE

「Chapter 12」- 名词从句

典型的名词从句
典型的名词从句具有以下几个特色:

(1)是简单句:本身原来是一个完整、独立的简单句。
(2)有连接词:前面加上连接词 that。这个连接词没有意义,只有语法功能,表示后面跟着一个名词从句。
(2)作名词用:名词从句须放在主要从句的名词位置(主语、宾语、补语、同位语等位置),当作名词使用。

现在依名词从句出现的各种位置来看看它的变化。
主语位置
示例一、普通改写

Something[S] is strange.

He didn’t show up on time.

(2) He didn’t show up on time 就是(1)主语 something 的内容。在(2)前面加上 that(表示“那件事”)就成了名词从句,可以直接放入(1)主语(something)的位置,做为 is 的主语使用,成为复句:

That he didn’t show up on time[S] is strange.

示例二、使用虚词
如果名词从句很长,直接放入主语位置使用时,可能会让读者看不清楚,这时候可以用 it 这个虚词(expletive)来填入主语位置,让主要从句 It is strange 比较清楚地表达出来,名词从句则向后移,成为复句:

It is strange that he didn’t show up on time[S].(真是奇怪,他没有准时来)

宾语位置
示例一、普通改写

The defendant[S] said[V] something[O].

He didn’t do it.

(2)的 He didn’t do it 就是(1)中 something 的内容,于是在(2)前面加上连接词 that 成为名词从句,然后直接放入(1)中作为 said 的宾语,成为复句:

The defendant[S] said[V] that he didn’t do it[O].(被告说那不是他做的)

示例二、使用虚词

I[S] find[V] something[O] strange[C].

He didn’t show up on time.

(2) He didn’t show up on time 就是(1)的宾语 something 的内容,可以加上连接词 that,成为名词从句,放入 something 的位置作宾语使用。可是它后面还有一个补语 str[……]

READ MORE

「Chapter 13」- 副词从句

副词从句是三种从属从句(名词、形容词、副词从句)中最简单的一种。它与主要从句之间,有点像对等从句的关系,很容易了解。副词从句因为结构十分单纯,所以学习副词从句的重点只是在认识各种连接词,以便写作时可以选择贴切的连接词来表达各种逻辑关系。
副词从句与对等从句的比较

Because[从属连接词] he needs the money[副词从句], he works hard[主要从句].(因为他缺钱,所以他勤奋工作。)

He needs the money[对等从句], and[对等连接词] he works hard[对等从句].(他需要钱,也勤奋工作。)

(1)是分成主、从的复句结构。其中副词从句 he needs the money 和主要从句 he works hard 分别都是完整、独立的简单句,以一个连接词连起来。这和(2)中两个对等从句的情形完全相同。唯一的差别是对等从句(2)使用对等连接词 and,连接起来的两个从句地位相等,没有主从之分,也不需互相解释。副词从句(1)则使用从属连接词 because,使得 because he needs the money 成为从属地位的从句,当作副词使用,用来修饰主要从句中的动词 works(交待 works hard 的原因)。除了这一层修饰关系之外,副词从句和对等从句同样单纯。
副词从句与名词从句的比较

The Witness[S] said[V] that[连接词] he saw the whole thing[O(名词从句)].(证人说他目睹了事情发生的全过程。)

The witness[S] said[V] this[O], though[连接词] he didn’t really see it[副词从句].(证人这样说,尽管他没有真正看到。)

副词从句和名词从句就有较大的差别。
两者的共同点
首先,两者原来都是完整、独立的简单句。(1)中的 he saw the whole thing 与(2)中的 he didn’t really see it。
然后,两者都是加上从属连接词构成从属从句,但是由此开始有了差别。
两者的不同点
第一个差别是:使用的连接词不同,一个有意义,一个无意义。名词从句加的连接词是 that,表示“那件事情”,此外没有别的意义。副词从句加的连接词,如(2)的 though,以及上节例子中的 because 等等,都是有意义的连接词,表达两句话之间的逻辑关系:though 表示让步,because 表示原因,if 表示条件。
第二个差别是:名词从句属于名词类,要放在主要从句中的名词位置使[……]

READ MORE

「Chapter 14」- 关系从句

从属从句有三种,除了名词从句和副词从句之外,还有就是形容词从句,又称关系从句。如同名词从句和副词从句一样,关系从句也有它明显的特色。
关系从句的特色
关系从句如果没有经过任何省略,都应该以形容词从句看待。 它的特色有以下几点:
一、两个句子要有交叉
也就是:两个句子间要有一个重复的元素,由此建立“关系”, 才可以用关系从句的方式来合成复句。例如:

For boyfriend I’m looking for a man. (找男朋友,我想找个男人。)
He is tall, rich, and well-educated. (他身材高、收入高、教育水准高。)

这两个句子中的 a man 和 he 是重复的:a man就是代名词he所代表的对象(即先行词)。因为有这个交叉存在,两个句子有关系, 才可以进行下一步的动作 —— 制造关系从句。
二、把交集点改写为关系词的拼法(wh-),让它产生连接词的功能
在上例中就是把he改写为who,成为:

who[S] is[V] tall, rich, and well-educated

这就是一个关系从句。Who 仍然具有 he 的功能,也就是作为这个从句的主语,但是它同时也有连接词的功能。
三、将关系从句附于主要从句的交集点(名词)后面来修饰它(作形容词使用)
上例中就是把 who 从句附在 a man 之后成为:

For boyfriend I’m looking for a man[名词(先行词)] who is tall rich, and well-educated[关系从句(形容词类)].
(找男朋友,我想找一个身材高、收入高、教育水准高的人。)

由以上的分析可以看出,关系从句有一个很重要的特色:关系从句的连接词是从句中内含字眼的改写,而名词从句与副词从句的连接词都是外加的。请比较下列三句:

I[S] know[V] that[连接词] I am right[O(名词从句)].(我知道我对。)

I[S] know[V] this[O] because[连接词] I have proof[副词从句].

(我知道,因为我有证据。)

I[S] don’t trust[V] people[O] who talk too much[关系从句].

(我不信任话太多的人。)

例1中的名词从句是由完整的简单句 I am right 外加连接词 that 所构成。例2的副词从句也是完整的单句 I have proof[……]

READ MORE

「Chapter 15」

内容简介[……]

READ MORE

「PART 3 (Reduced Clauses and Inverted Sentence)」

内容简介

章节列表
「Chapter 22」 「Chapter 19」 「Chapter 16」- 从属从句简化的通则 「Chapter 20」 「Chapter 21」 「Chapter 17」 「Chapter 18」[……]

READ MORE

「Chapter 16」- 从属从句简化的通则

简化从句
英语语法以句子为研究对象。英语句型有结构较单纯的简单句 与结构较复杂的复句、合句之分,在前面已分别探讨过。简单句的结构比较单纯,只有五种基本句型的变化。作文中若只用简单句, 除了风格不够成熟外,表达力亦嫌薄弱。间杂复句、合句于文中, 则有助于表达较为复杂的观念,亦可丰富句型的变化,使风格趋于成熟。
然而,复句、合句包含两个以上的从句,其间往往有重复的元素,因而有进一步精简的空间。若剔除重复或空洞的元素,让复句、合句更加精简,又不失清楚,这就是简化从句。如果说简单句是初级句型,复句、合句是中级句型,那么精简的简化从句就是高级句型。这种句型可以浓缩若干句子的意思于一句,同时符合修辞学对 清楚与简洁的要求,是讲究修辞的 TIME 大量使用的句型。
合句的简化方式
删除对等从句间相对应位置(主语与主语、动词与动词等等)重复的部分,第十五章已经以例句的方式介绍过其简化方法。
复句的简化方式
包括名词从句、形容词从句、副词从句三种的简化。一般语法书称这三种从属从句的简化为“非限定从句”(NonfiniteClauses),并称其中的 Ving(动名词或现在分词)、Ven(过去分词)与toV(不定词)为“非限定动词”(Nonfinite Verbs)
为何不称“非限定从句”?
读者可能会感到奇怪,为何本书不沿用行之有年的“非限定从句”观念,而要提出新的“简化从句”(Reduced Clauses)概念,原因有二:

第一,“非限定从句”的概念固然很好,但是对于各种非限定动词的由来、变化及如何选择等等问题所提出的说明,似乎不易让学习者很快通盘了解,至少从笔者接触的学习者及教学经验中观察 是如此。

第二,非限定从句往往被与非限定动词划上等号。亦即,许多学生只知有 to V、Ving 与 Ven,而不知还有许多其他的变化。因此, 笔者尝试建立一套统一、易懂的结构,来诠释比较复杂的高级句型变化。简化从句的观念就是如此产生的。这个观念回溯到修辞的根源,以修辞的两大要求清楚(clear)与简洁(concise) 为岀发点,借着探讨如何由完整的从句简化为非限定从句等等的过程,帮助学习者了解各种句型变化的道理。

简化从句的观念可以说是笔者对修辞学的观察与教学经验结合的成果,并已经过长期实际教学所验证,能在短期内大幅促进学习 者对英语句型的掌握。
从属从句简化的通则
不论是名词类、形容词类还是副词类的从属从句,简化的共同原则是省略主语与 be 动词,只保留补语部分。这当中还有一些变化,例如若省略从属从句的主语会造成主语不清时该如何处理?剩下的补语部分如果词类与原来的从属从句词类不同时要怎么办?还有,连接词是否应一并省略?这些问题在不同词类的从属从句中[……]

READ MORE

「Chapter 18」

内容简介[……]

READ MORE

「Chapter 19」

内容简介[……]

READ MORE

「Chapter 22」

内容简介[……]

READ MORE

「kbd」

KBD,一个软件包,包含用于管理Linux控制台、更换字体、调整文本模式虚拟控制台、键盘映射。
注意,这里的字体与X Window中的字体不是同一个概念。
命令列表
chvt:Changes the foreground virtual terminal
deallocvt:Deallocates unused virtual terminals
dumpkeys:Dumps the keyboard translation tables
fgconsole:Prints the number of the active virtual terminal
getkeycodes:Prints the kernel scancode-to-keycode mapping table
kbdinfo:Obtains information about the status of a console
kbd_mode:Reports or sets the keyboard mode
kbdrate:Sets the keyboard repeat and delay rates
loadkeys:加载键盘转换表(keyboard translation tables)
loadunimap:Loads the kernel unicode-to-font mapping table
mapscrn:An obsolete program that used to load a user-defined output character mapping table into the console driver; this is now done by setfont
openvt:Starts a program on a new virtual terminal (VT)
psfaddtable:Adds a Unicode character table to a console font
psfgettable:Extracts the embedded Unicode character table from a console font
psfstriptable:Removes the embedded Unicode character table from a console font
psfxtable:Handles Unicode character tables for console fonts
setkeycodes:Loads kernel scancode-to-keycode map[……]

READ MORE

「setfont」

setfont,加载EGA/VGA控制台屏幕字体。
命令行语法格式
setfont [-O font+umap.orig]

[-o font.orig]
[-om cmap.orig]
[-ou umap.orig]
[-N] [font.new …]
[-m cmap]
[-u umap]
[-C console]
[-hH]
[-v]
[-V]

命令简述(DESCRIPTION)
setfont从文件font.new读取字体并将其加载到EGA/VGA字符生成器中,并可选择输出以前的字体。它还可以加载各种映射表,并输出以前的版本。
如果没有给出任何参数(或者只有一个指定了数值的-N选项),则加载默认的(8xN)字体(见下文)。 一个可能会提供几个小字体,全部的会包含一个Unicode表,而setfont将会结合它们,并加载联合后的。
下面是一些典型的使用方法:
setfont 加载默认字体。
setfont drdos8x16 加载给定字体。这里是448-glyph drdos字体。
setfont cybercafe -u cybercafe 加载一个没有Unicode映射的字体,并明确指定一个。
setfont LatArCyrHeb-19 -m 8859-2 加载一个给定的字体(这里是结合了几个字符集的512-glyph字体),并指出一个的本地字符集是ISO 8859-2。
注意:如果字体超过256个字形,则只可以同时使用16种颜色中的8种。它可以使控制台感觉更糟(强度损失,甚至一些颜色)。
字体格式(FONT FORMATS)
标准的Linux字体格式是PSF字体。它具有描述字体属性(如字符大小)的头部,后跟「字形位图(glyph bitmap)」,后跟一个可选的Unicode映射表,给出每个字形的Unicode值。识别了其他几种(过时)字体的格式。如果输入文件具有代码页格式(可能是后缀.cp),其中包含三个字体大小,例如。 8×8,8×14和8×16,则必须使用选项-8或-14或-16之一来选择一个。原始字体文件是大小256 * N字节的二进制文件,包含256个字符,每个扫描行一个字节和每个字符N个字节(0 <N <= 32)的位图。大多数字体的宽度为8位,但是使用帧缓冲设备(fb)可以使用其他宽度。
If the input file has code page for‐ mat (probably with suffix .cp), containing three fonts with sizes e.g. 8×8, 8×14 an[……]

READ MORE

「showconsolefont」

showconsolefont,显示当前的EGA/VGA控制台屏幕字体。
命令行语法格式
showconsolefont [ -V ] [ -v ] [ -C console ]
命令支持的选项及含义
-v 显示附加的信息。
-C 在Linux 2.6.1及更高版本上,选项-C允许指定控制台。它的参数是一个路径名。
-V 显示版本号。
相关文档
setfont(8)
有关控制台字体的内容,参考:Console Fonts
参考文献

man 8 showconsolefont, version showconsolefont from kbd 2.0.3
https://unix.stackexchange.com/questions/321784/why-does-showconsolefont-have-different-output-in-tmux/321979[……]

READ MORE

「REGULAR EXPRESSION」- 常用代码

匹配中文字符,但并不包含标点符号:[\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff]
常用特殊字符
.,匹配任意单个的字符,包括空格 例如:0.0 匹配 0x0、020、…
^,匹配行首的位置,即一个字符串的开始 例如:^10 匹配 10.1.1.1,不匹配 20.1.1.1
$,匹配行尾的位置,即一个字符串的结束 例如:1$ 匹配10.1.1.1,不匹配10.1.1.2
_,下划线,匹配任意的一个分隔符:匹配单个逗号(,)、左花括号({)、右花括号(})、左圆括号、右圆括号;匹配输入字符串的开始位置(同^);匹配输入字符串的结束位置(同$);匹配一个空格; 例如:_10 匹配 (10、{10、空格10;10_ 匹配 10)、10}、10空格
|,管道字符,逻辑或。x|y,匹配x或y 例如:100|200 匹配100或者200
\,转义字符,用来将下一个字符(特殊字符或普通字符)标记为普通字符 例如:\* 匹配 *
*,匹配前面的子正则表达式0次或多次 例如:10* 匹配1、10、100、1000、… 例如:(10)* 匹配空、10、1010、101010、…
+,匹配前面的子正则表达式1次或多次 例如:10+ 匹配10、100、1000、… 例如:(10)+ 匹配10、1010、101010、…
?,匹配前面的子正则表达式0次或1次 例如:10? 匹配1或10 例如:(10)? 匹配空或10
(),圆括号可以用来定义操作符的范围和优先度。 例如:gr(a|e)y等价于gray|grey。
[xyz],匹配正则表达式中包含的任意一个字符 例如:[123] 匹配255中的2
[^xyz],匹配正则表达式中未包含的字符 例如:[^123] 匹配123之外的任何字符
[a-z],匹配正则表达式指定范围内的任意字符 例如:[0-9] 匹配0到9之间的所有数字
[^a-z],匹配正则表达式指定范围外的任意字符 例如:[^0-9] 匹配所有非数字字符(即匹配0到9之外的任何字符)
常用正则表达式

# 处理汉字空格
([^\x00-\xff]) ([^\x00-\xff])

\1\2

# 中英文之间添加空格
([^\x00-\xff,、:。)(])([A-z])

\1 \2

([A-z…])([^\x00-\xff,、:。…)(])
\1 \2

# 逗号替换
([^\x00-\xff])\s*,
\1,

,\s*([^\x00-\xff])
,\1

# 其他替换处理
([^\x00-\xff])([\x00-\xff])

([A-z])([^\x00-\xff])
\1 \2[……]

READ MORE

「Shell」- 数据类型:日期

常用日期格式

# 2023-01-18 14:33:09
date “+%Y-%m-%d %H:%M:%S”

判断日期是否在某个时间段之内
bash – Calculate time difference between two dates – Unix & Linux Stack Exchange

CURRENT_TIME=$(date ‘+%H%M’)

[ “0805” -lt “$CURRENT_TIME” ] && [ “$CURRENT_TIME” -lt “0910” ] && echo “Skip between 08:50-09:10” && exit
[ “1350” -lt “$CURRENT_TIME” ] && [ “$CURRENT_TIME” -lt “1410” ] && echo “Skip between 13:50-14:10” && exit
[ “1920” -lt “$CURRENT_TIME” ] && [ “$CURRENT_TIME” -lt “1940” ] && echo “Skip between 19:20-19:40” && exit[……]

READ MORE

「Docker Compose」- 安装(x86、arm、amd64)

在 x86 中,安装 Docker Compose 命令
方法一、从 GitHub 中安装(推荐)
国内的安装方法(解决网络问题):

# 安装最新版本
# 参考 https://get.daocloud.io/#install-compose 文档

# 1.29.2
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` \
> /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# 2.15.1
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.15.1/docker-compose-`uname -s`-`uname -m` \
> /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

官网的安装方法:

curl -s -L “https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)” \
-o /usr/local/sbin/docker-compose

chmod +x /usr/local/sbin/docker-compose

方法二、使用 pip 安装(不建议使用)
在安装过程中,该方法需要处理依赖问题与版本问题,略显复杂,因此不建议使用该方法:

pip install -U docker-compose

方法三、从仓库中安装(不建议)
在 CentOS 7 及 Debian 10 中,仓库已经内置 Docker Compoes 包,可以直接安装:

yum install -y docker-compose.noarch

apt-get install -y docker-compose

但是,从仓库安装的 Docker Compose 命令的版本较旧,经常会提示各种问题。因此,我们很少采用这种方法来安装。
在 arm64 中,安装 Docker Compose 命令
通过仓库安装(APT)

# Ubuntu 18.04 ARM64
apt-get install docker-compose[……]

READ MORE

「docker-compose」- 常用命令及常见问题处理

常用命令

docker-compose help

docker-compose ps

docker-compose logs

docker-compose stop # 首先使用docker-compose stop停止命令

docker-compose kill # 如果服务没有停止,可以结束进程

docker-compose start

docker-compose rm # 删除服务

重启特定服务(容器),并使配置生效
docker-compose down | Docker Documentation docker-compose restart | Docker Documentation How to restart a single container with docker-compose – Stack Overflow
当修改 docker-compose.yml 文件后,需要重启容器(docker-compose down, then docker-compose up),以使新的配置生效。
但是,我们希望仅仅重启特定服务(容器),而不是全部重新启动。解决方案:

docker-compose up –detach –build “<service name>”

查看容器日志

docker-compose logs “service name”

docker-compose logs -f “service name”

# 如果不使用 –tail= 选项,则日志会不断的输出,最后才会出现 -f 效果。
docker-compose logs –tail=10 -f[……]

READ MORE

「Docker Compose」- 生成镜像构建命令

问题描述
在 Docker Compose 中,可以使用 docker-compose build <service> 可以构建单独的镜像。
但是,在实际的应用过程中,还会遇到其他的更复杂的需求,导致我们需要从 docker-compose.yaml 提取构建命令。
该笔记将记录:在 Docker Compose 中,如何使用 docker-compose.yml 生成构建命令。
解决方案
# 04/15/2021 虽然 docker-compose.yaml 支持 build 指令,但是我们很少使用该指令,我们将 docker-compose 作为容器编排的部署工具,而不是构建工具。如果在 docker-compose 中完成构建,那么我们将难以很好的集成到 GitLab CI/CD 中,因此才放弃使用 docker-compose build 方式。
第一步、安装依赖
安装 yq 命令:

apt-get install -y jq
pip3 install yq

因为 yq 是对 jq 命令的封装(还有一个 yq 是 Golang 版本),因此需要 jq 命令。
第二步、执行命令
如下命令,可以用于生成 docker build 命令:

docker-compose -f docker-compose-with-build.yml config \
| yq -r ‘.services | .[] | select(.build != null) | “docker build -f ” + .build.context + “/” + .build.dockerfile + ” -t ” + .image + ” ” + .build.context’

如下命令,可以用于执行命令(去掉 echo 命令):

docker-compose -f docker-compose-with-build.yml config \
| yq -r ‘.services | .[] | select(.build != null) | [.build.dockerfile, .image, .build.context] | @tsv’ \
| while IFS=$’\t’ read -r dockerfile image context
do
echo docker build -f “${context}/${dockerfile}” -t “${image}” “${context}”
done

参考文献
docker-compose build | Docker Doc[……]

READ MORE

「Docker Compose」- 向远程主机部署服务

问题描述
通常,我们本地编写 docker-compose.yml 文件,然后运行测试。但是,我们需要在 arm64 环境中进行测试,无法在本地直接运行测试。
我们希望可以在本地编写,然后本地使用 docker-compose up 直接在远程 arm 主机上运行测试。
该笔记将介绍:在本地运行 docker-compose 命令,但是在远程主机中启动服务的方法。
方法一、在上传后执行(传统方法)
在传统方法中,我们需要将 docker-compose.yaml 及相关文件,上传到远程主机,然后执行 docker-compose up 启动服务。
这里不再赘述……
方法二、使用 DOCKER_HOST 变量
使用 tcp 协议
第一步、修改 Docker 服务配置,使其监听 TCP/2375 端口(不再赘述)
第二步、通过 DOCKER_HOST 变量指定远程服务,比如 DOCKER_HOST=”tcp://0.0.0.0:2375″ 指定远程服务:

DOCKER_HOST=”tcp://192.168.10.143:2375″ docker-compose up -d

docker-compose –host “tcp://192.168.10.143:2375″ up -d

使用 ssh 协议(推荐)
我们想使用 TCP 协议(即我们不会改变 docker 配置,使其监听 TCP 端口),而是使用 SSH 协议:

DOCKER_HOST=”ssh://root@192.168.10.143” docker-compose up -d

docker-compose –host “ssh://root@192.168.10.143” up -d

使用 SSH 协议需要注意以下问题: 1)从 Docker 18.09 开始支持 SSH 协议; 2)如果使用 SSH KEY 连接主机,需要 ssh-add -k /path/to/key-file 命令添加密钥,因为 docker-compose 不支持命令行指定密钥,也不会解析 .ssh/config 文件。
该方法的局限性
虽然是远程执行,但本质上还是将命令发送到 Docker 守护进程,也就是说本地配置文件不会发送到远程主机。即类似于 volumes: [“./config:/config”] 指令不会生效,因为在 config 下的配置文件不会发送到远程主机。
方法三、使用 Docker Context 命令
在 Docker 19.03.0 中,引入 Docker Context 支持。Docker Engine release notes | D[……]

READ MORE

「Docker Compose」- 在 CI/CD 中,分离 docker-compose build 与 docker-compose up 指令

问题描述
在 CI/CD 中,我们使用 Docker Compose 来进行容器编排。
但是如果 docker-compose.yaml 包含 build 指令,会导致我们无法分离构建阶段与运行阶段。
该笔记将记录:在使用 Docker Compose 编排时,如何分离构建阶段与运行阶段。
解决方案
docker-compose build docker-compose push docker-compose pull docker-compose up -d
参考文献
docker-compose up | Docker Documentation docker-compose pull | Docker Documentation docker-compose push | Docker Documentation[……]

READ MORE

「Docker Compose」- 在构建时,使用网络加速(代理)

问题描述
在 Docker Compose 中,支持使用 build 指令,以构建运行服务所需要的镜像。
但是,某些构建需要下载国外资源(比如 golang 构建),然而由于网络原因会下载失败。
该笔记将记录:如何在构建时使用网络加速服务(代理)来解决该问题。
解决方法
在构建时,可以制定参数,或者设置环境变量:
1)通过指定构建参数:

docker-compose build \
–build-arg http_proxy=http://proxy.exaple.com \
–build-arg https_proxy=http://proxy.exaple.com

2)通过设置环境变量:

# docker-compose.yaml

build:
context: .
args:
– http_proxy=http://proxy.exaple.com
– https_proxy=http://proxy.exaple.com

参考文献
Docker Build Proxy: Setup the proxy for Dockerfile building – DEV Compose file version 3 reference | Docker Documentation elasticsearch – docker-compose build and http_proxy – Stack Overflow[……]

READ MORE

「Docker Compose」- 开机自动启动应用容器

问题描述
当我们使用 Docker Compose 启动应用程序之后,如果主机发生重启,应用容器无法自动启动。
我们可以使用 Docker Compose 的重启策略,但是也存在一些问题。
该笔记将记录:1)自动启动服务的解决方案、2)及其常见问题和解决方法
方法一、通过 Docker Restart Policy 方法
在 Docker 中,支持 –restart 选项,来控制容器自动启动。在 Docker Compose 中,应该使用 restart 属性:

version: “3.6”
services:

frontend:
image: frontend:v1.0.0
depends_on:
– backend
restart: always

backend:
image: backend:v1.0.0
restart: always

注意事项: 1)Docker 并不知道这些服务的依赖关系及启动顺序,需要我们精心编排 docker-compose.yaml 文件; 2)Docker Compose 不支持 deploy:restart_policy 属性,该属性只能用于 a swarm with docker stack deploy 环境;
方法二、通过进程管理服务(推荐)
该方法本质上还是在执行 docker-compose 命令。
使用 systemd 管理
如下示例,可以根据需要进行设置:

# cat /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker/app/
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

参考文献
Start containers automatically | Docker Documentation How to run docker-compose up -d at system start up? – Stac[……]

READ MORE

「GitLab CI/CD」- 常用 GitLab Runner 管理

注册 Executor 服务
Registering runners | GitLab

# 通过交互完成注册
gitlab-runner register

# 通过命令直接注册
gitlab-runner register –non-interactive \
–url “https://gitlab.com/” \
–registration-token “sBZ7xHzxTz6Ec9mYb1yp” \
–executor “docker” –docker-image ubuntu:latest \
–tag-list “build-in-docker,executor=docker” \
–run-untagged=”true”

gitlab-runner register \
–non-interactive \
–url “https://your.gitlab.server.com/” \
–registration-token “YOUR_REGISTRATION_TOKEN” \
–executor “ssh” \
–ssh-host “REMOTE_SERVER_IP” \
–ssh-port “22” \
–ssh-user “REMOTE_SERVER_USERNAME” \
–ssh-password “REMOTE_SERVER_PASSWORD” \
–ssh-identity-file “/path/to/ssh/private/key” \
–tag-list “ssh,linux”

配置重新加载
GitLab Runner commands/Signals

kill -SIGHUP <main_runner_pid>

并行执行任务数
Advanced configuratio[……]

READ MORE

「Apache Benchmark/ab」- Apache 基准测试

内容:Apache中的ab命令介绍。
ab是Apache HTTP服务器的基准测试工具,用于对Apache HTTP服务器进行基准测试。目的就是为了让你对当前的Web Server的性能有个印象。尤其显示了当前的Web Server每秒能处理的请求数。
ab属于httpd软件包。
命令行语法

ab [ -A auth-username:password ] [ -b windowsize ] [ -B local-address ] [ -c concurrency ] [ -C cookie-
name=value ] [ -d ] [ -e csv-file ] [ -f protocol ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [
-i ] [ -k ] [ -l ] [ -m HTTP-method ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-username:pass‐
word ] [ -q ] [ -r ] [ -s timeout ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -u PUT-file ] [ -v
verbosity] [ -V ] [ -w ] [ -x <table>-attributes ] [ -X proxy[:port] ] [ -y <tr>-attributes ] [ -z
<td>-attributes ] [ -Z ciphersuite ] [http[s]://]hostname[:port]/path

命令行选项
下面是ab命令支持的选项
用于帮助类信息
-h/-V
显示帮助/版本信息。
用于数据分析类
-e csv-file
包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间 这通常比gnuplot文件有用,因为结果已经“二进制”了。
-g gnuplot-file
将所有测量值写为“gnuplot”或TSV(Tab分割)文件。该文件可以轻松地导入到Gnuplot,IDL,Mathematica,Igor甚至Excel等软件中。标签位于文件的第一行。
控制输出结果
-v verbosity
设置输出的详细等级。4+时打印标题;3+时打印响应代码(404,200等),2及以上打印警告和信息。
-w
在HTML表格中打印出结果。默认表是两列宽,带有白色背景
-x[……]

READ MORE