2019年7月16日 星期二

Unix命令语法细节

在使用Unix CLI(命令行界面)时,需要一条接一条的输入命令。输入这些命令时,需要遵循Unix命令语法。 所输入的整行称为命令行。当在命令行的末尾按<Return>键时,命令行的内容就发送给shell进行处理。
在输入命令时,有两件事情需要了解。首先,必须根据Unix命令语法输入命令。其次,必须理解在shell处理命令的过程中发生了什么事情。
Unix中有差不多数百条命令,而且只要您使用Unix,就要永远不停的学习新的命令。基于这一原因,当需要时,您应该能够通过联机手册学习。为了更好的使用联机手册,您需要理解Unix命令语法和Unix命令语法细节。
1. 一次输入多条命令
在大多数情况下,一个命令行只输入一条命令。但是,您应该知道,一次输入多条命令也是可以的。在输入多条命令时,Unix命令语法是只需用分号将各个命令隔开即可。
下面举一个使用这中Unix命令语法的例子。您在打电话与您的朋友计划一个派对。您希望显示今天的日期以及当前月份的日历。完成这两项任务的命令分别为datecal。当然,您可以分开输入这两条命令:

date
cal


但是,使用一个分号作为命令分隔符就可以在一行输入这两条命令:

date; cal

注意命令行的末尾并不需要分号。
下面再举一个例子,这个例子使用cp命令复制文件,ls命令显示文件的信息,以及rm命令删除(移除)文件。
您的目标是为一个名为data的文件生成两个副本。两份副本分别称为backup1backup2。在生成文件副本之后,您希望删除原始文件。然后,列出所有文件,看看有什么文件。相关的Unix命令如下所示:

cp date backup1

cp date backup2

rm data

ls


这里的重点是,我们不是在4个独立的行上键入这些命令,而是通过使用分号分隔这些命令,在一行上输入它们:

cp date backup1;cp date backup2;rm data;ls

您或许会问,在一行上输入所有命令有什么意义呢?毕竟,这只是以另一种方式键入相同数量的字符。
答案在于,从长远来看,如果您能够一次考虑好接下来几步的行动,就像下象棋者在决定下一步棋如何走时,会考虑接下来的各种变化一样,那么您就能更有效的使用Unix。
提示,一名Unix用户和一名伟大的Unix用户之间的区别在于解决问题的能力,即当问题出现时,能够将各种工具和思想快速,创造性的组合在一起,并且还不忙乱。实际上,一些人认为,这是熟练使用Unix的本质要求。
2.输入命令时会发生什么事情
在输入命令时,Unix命令要求键入命令的名称,后面还可能根一些其他信息。例如,考虑下面的ls命令行:

ls -l -F file1

该Unix命令有4部分:命令的名称ls,后面跟着-l, -F, 和file1
当按下<Return>键时,shell就会处理命令。下面我们对这个Unix命令进行一个简化的描述,这样使大多数人都可以明白。 
shell通过假定命令行的第一部分是希望运行的命令名称来处理命令。然后,shell根据该名称搜索并执行程序。例如,如果输入的是上面ls命令,那么shell将查找并运行ls程序。
如果shell找不到输入的命令的名称,那么shell将显示一个错误信息。例如,假如输入了:

harley

虽说难以相信,但是Unix并没有harley这条命令,所以您将看到:

harley: not found

当shell查找到希望运行的程序时,它就会运行这个程序。这是,shell将整个命令行的一份副本发送给该程序。然后轮到程序来决定如何处理所有信息了。在上面大的例子中,ls程序将决定如何处理-l, -F, 和file1

3. Unix命令语法
Unix命令必须根据一个明确定义的规则键入。一个标点符号放错位置或者单词拼写错误,都会整个命令无效。大多数命令,系统会显示一个错误的信息,并且忽略这个命令。但是,在最坏的情况下,一条错误键入的命令可能回错误的执行,造成其他问题。关于如何输入命令的格式描述称为命令语法(command syntax),不正式的称法可以称之为语法
学习Unix命令语法很简单,只要您了解了通用规则和约定,就可以通过查找手册或者Info系统自己学习如何正确使用任何命令。
通常,Unix命令语法可以表示为:键入命令的名称,后面“选项(options)”,再后面是“参数(arguments)”:

命令名称 选项 参数

选项用于设置命令执行任务的方式,而参数指定命令使用的数据。
考虑下面的例子:

ls -1 -F file1 file2 file3

在这个例子中,命令名称是ls。选项是-1和-F。参数是file1,file2file3。

4. 选项
当键入命令时,可以使用Unix命令语法细节中的选项来修改命令执行任务的方式。当阅读Unix文档资料时,有时候会看到称选项为开关(Switches)或者标志(Flags),因此你也要知道这些单词。
顾名思义,选项是可选的。大多数命令都至少拥有几个选项,有一些命令的选项如此之多,每个人都需要依赖于手册查找模糊的选项,即便是有经验的人。
在命令行中,选项直接位于命令名称之后。Unix命令语法细节中的选项通常由一个连字符后跟一个字母,或者两个连字符后跟一个单词组成。例如:

ls -l -F file1 file2 file3
ls --help

那么怎样解释这个Unix命令语法细节呢?在第一条命令中,有两个选项-l-F。在第二条命令中,有一个选项--help
选项的任务就是控制命令的动作。例如,在上面的例子中,选项-l告诉ls命令显示“长”列表。通常,ls命令只显示文件的名称。当使用-l选项时,ls将列举每个文件的额外信息,以及文件的名称。
有时,您可能看到选项是一个数字,例如:

ls -1 file1 file2 file3

在这个例子中,小心不要混淆了-l(小写字母 “l”)和-1(数字“1”)。
当使用多个单字符的选项时,可以将它们组合在一起,只使用一个连字符。此外,Unix命令语法选项可以以任意的顺序指定。因此,下面所有的命令都是等价的:

ls -l -F file1
ls -F -l file1
ls -lF file1
ls -Fl file1

对于Unix的所有命令,都必须确保正确使用了大写字母和小写字母。例如,命令ls既拥有-F选项,也拥有-f选项,这个两个选项完全不同。通常情况下,大多数选项都是小写字母。
提示:
在手册中查找命令时,您将会看到每个选项都对应一个解释。但是,说明书页并没有说明单字符选项可以组合在一起。例如,-l -F可以组合成-lF。这是基本的Unix文化,手册假设您知道这一点。
当我们谈论Unix命令语法细节选项时,连字符如何发音呢?
以前它发音为“minus”。在Linux文化中,将连字符称为“dash”比较常见,特别是在年轻用户中。因此,Linux人士通常是将ls -l发音为“L-S-dash-L”。同样,将“ls –help”发音为“L-S-dash-dash-HELP”。

6. -选项和--选项
这里我们来讨论以下Unix命令语法细节中的-选项和--选项,当谈论选项时,单个的-格式是比较古老的。它可以追溯到最早的Unix系统。那时,程序员期望简化命令行。许多命令的名称只有两个或者三个字母,而且所有的选项只有一个字母。
许多年过去之后,当GUN使用工具开发出来时,设计人员希望能够使用较长的选项。但是,长时间的约定认为所有选项应该只有一个字母,而且选项可以按照前面解释的方式组合在一起。例如,假如shell遇到了下述命令,会发生什么事情呢?

ls -help

因为多个选项可以组合在一起,所以-help选项将被解释为4个单独的选项:-h, -e, -l, 和-p
当然,规则也可以修改,但是这是一个极端的修改,将使许多已有的程序无效,并且强制太多的人改变他们的习惯。实际上,人们最后决定使用更长的选项,但是它们前面要前置连个连字符,而不是一个。通过这种方式,系统可以进行扩展,而且不必损耗已有的体统。
因为Linux使用GUN实用工具,所以,如果您是Linux用户的话,就可以看到两种类型的选项。对于大多数系统来说,通常只有单字符的选项。
设计--选项的主要目的是使用较长的选项,从而是选项更容易理解和记忆。另一方面,较长选项键入速度较慢,并且更易于拼错。基于这一原因,许多命令同时提供了长和短的选项,用户可以根据自己的琴况选择使用。
例如,列举ls(列举文件信息)拥有一个-r选项,该选项是ls命令以相反的顺序列举文件。对于Linux来说,该命令还有一个--reverse选项,与-r选项作用相同。因此,下述两条命令是等价的:

ls -r
ls --reverse

--选项领域中,当使用GUN实用工具时经常会遇上两个选项。如果您是Linux用户,那么两个选项值得记住。
第一个是常见的--选项是--help选项,如果使用该选项,将显示命令语法摘要。通常,这个选项单独使用。例如:

ls --help
date --help
cp --help

在许多情况下,摘要可能很长,以至于在阅读之前就滚动出屏幕。如果发生这种情况,可以将输出发送给less程序,后者将每次一屏的显示输出信息。实现这种操作时,只需键入一个|(竖线)字符,后面跟着less即可。例如:

ls --help | less
date --help | less
cp --help | less

第二个是常见的--选项是--version

ls --version
date --version
cp --version

该选项显示系统上所安装的程序的版本信息。通常,这并不是有价值的信息,但是,如果遇到了问题,那么它有时后可以帮助了解正在运行程序的版本。
提示:
键入选项的规则对几乎所有的Unix命令而言都是相同的:每个选项或者以一个连字符,或者以两个连字符开头,单字符的选项可以组合起来。但是,也有几个例外的情况。
有一些抹零使用没有连字符的选项。有些命令接受连字符,但是并不要要求。最后还有一些命令不允许组合单字符选项。
幸运的是,这些例外十分罕见。如果您使用某个命令时遇到了问题,可以查看说明书页。说明书页是最终的权威参考。

7. 参数
前面提到过Unix命令的通用语法可以表示为命令的名称,后面是选项,在后面就是参数:

命令名称 选项 参数
参数在命令行上用来向希望运行的程序传递信息。考虑下面的例子,该类在前面讨论选项的过程中使用过:

ls –l –F file2 file3
在这个Unix语法命令行中,命令是ls,选项是-l-F,而参数是file1,file2file3。参数的含义随着命令的不同而不同。典型情况下,参数指定程序执行动作所需的数据,在我们的例子中,指定了3个文件的名称。
考虑一个例子:

man date

在这个例子中,命令名称是man, 没有选项,而参数是date。在这条命令中,我们告诉man显示date的说明书页。
最后一个例子:

Passwd weedly

这里使用的命令是passwd(change password,改变口令),该命令有一个参数weedly,在这个例子中,我们表示希望改变用户表示weedly的口令。
名称含义:
Unix命令的一般语法是:

命令名称 选项 参数

单词“option(选项)“有意义是因为命令行选项允许您选择命令的执行方式。但是,单词”argument(参数)“呢?很明显,它并不表示某项智能活动,或者”准备建立一个媒体一系列相互链接的陈述“。
实际上,计算机术语“参数”取自数学,在数学中它指的是自变量。例如,在方程f(x)=5x+17中,参数x。从这种意义上讲,参数就是命令或者函数所操作的对象。
在英语中,单词“argument”取自拉丁语语中的单词arguere,它的含义是阐明或者解释。

8. 空白符
在输入命令时,必须要确保将每个选项及参数分开。为了实现该目的,命令每个部分之间必须至少一个空格或者制表符。例如,下面输入同一条命令的几种方式。注意这里显示指定了使用<Space>和<Tab>键的地方:

ls<Space>-l<Space>-F<Space>file1
ls<Tab>-1<Tab>-F<Tab>file1
ls<Space><Tab>-1<Space>-F<Tab><Tab><Tab>file1 

当然,一般情况下命令的每个部分之间使用一个空格即可。实际上,对于一些shell来说,只能使用空格,因为制表符拥有一个特殊的功能(称为命令自动补全)。但是,使用空格和制表符作为分隔符的思想如此重要,所以它们拥有自己的名称:空白符。
在使用Unix的过程中,这一思想会反复出现,因此给出一个明确的定义。在命令行中,空白符指的是一个或者多个连续的空格或者(对于一些shell来说)制表符。在其他情形中,空白符可能指一个或者多个连续的空格,制表符或者新行字符。
如果您是一名Windows或者Macintosh用户,就可以看到含有空格的文件名称。例如,Windows系统就使用诸如“Program Files”,“My Documents”等文件夹(目录)名称。在Unix中,认为命令行中的空格是空白符,这样就不能在文件的名称中使用空格。同理,Unix命令的名称中也没有空格。
提示:
当选择拥有不止一个部分的名称时,永远也不要在名称的中间使用空格。不过可以使用连字符(-)或者下划线(_)。
例如,下面都是有效的名称:

program-files
program_files
my-documents
my_documents

我个人喜欢用连字符,因为连字符比下划线更容易阅读。
(提醒:Unix区分大写字母和小写字母。另外,在大多数时候,我们职位名称使用小写字母)
名称含义
空白符
术语“whitespace,空白符“指连续的空格或者制表符,空白符同夹将两项分开,该名称起源于最初在纸上进行打印的Unix终端。在键入命令时,各个单词之间真的留有空白。
Unix shell(命令处理器)被设计得非常灵活,它对命令行各部分之间有多少空格并不介意,只要词与词之间分开就可以。因此,术语“空白符”意味着任意数量的空格和制表符。
后来,对于特定的应用程序,该术语的含义扩展为任意数量的空格、制表符或者新行字符。

9. Unix短语:一个或多个;零个或多个
再将数Unix命令的标准描述方法之前,需要先定义两个重要的短语:“一个或多个”和“零个或多个”。
当看到短语“一个或多个”时,它意味着必须至少使用一个,下面举例说明。
前面,我们讨论了如何使用whatis命令。根据联机手册中关于某命令的条目,whatis命令显示一条命令的简要描述。当使用whatis时,必须指定一个或者多个命令名称作为参数。例如:

wahtis man cp
whatis man cp rm mv


第一个例子有两个参数,第二个例子有4个参数。因为该命令的规范要求“一个或多个”名称,所以至少包含一个名称——它并不是可选的。
另一方面,“零个或多个”意味着可以使用一个或多个表示,但是也可以一个都不使用。
例如,前面提到过的ls命令加上-l选项可以列出指定文件的信息。该命令的准确格式要求指定零个或多个文件名称。下面示范3个例子:

ls -l
ls -l file1
ls -l file1 file2 data1 data2


当看到要求零个或多个规范时,您应该问:“如果我一个也不会会怎么样?”一般来说,这种情况下,系统使用一个默认值,即假定值。
对于ls命令来说,默认值是当前“工作目录”中的所有文件。这样,如果像第一个例子那样,不知低昂任何文件的名称,那么ls将列出当前工作目录中所有文件的信息。当指定一个或者多个文件名称时,ls将显示这些特定文件的信息。

提示:
每当被告知可以使用一个或者多个对象时,都要问一问:默认值是什么?

10. Unix命令的形式描述:语法 
学习新命令的一种好方法是回答下述3个问题:
命令是做什么的?
如何使用选项?
如何使用参数?
通过使用man命令查阅联机手册,然后阅读该命令的摘要就可以知道该命令的用途。如果需要了解更过的信息,可以查阅该命令的完整描述。
在查阅说明书页时,能见到命令的语法:命令的准确,正规的使用规范。通俗一点讲,语法时命令如何使用的“官方”描述。
在Unix中,命令语法遵循7条规则。其中前5条规则是最基本的规则,因此我们从这5条规则开始。稍后再讨论另外2条规则。
(1)方括号中的选项是可选的。
(2)不在方括号中的项是必选项,必须作为命令的一部分输入。
(3)黑体字必须按原样准确输入
(4)斜体字必须用适当的值代替。
(5)后面接省略号的参数可以重复任意多次
现在举例说明这些规则的应用。下面是某个特定Unix系统中ls命令的语法:

ls [-aAcCdfFgilLqrRstul] [filename...
从这个Unix语法描述中,可以得出什么结论呢?
该命令有18个不同的选项。可以使用-a,-A,-c,-C的选项,因为选项是可选的,所以用方括号将它们括起来。换句话说,就是可以使用零个或者多个选项。
该命令有一个参数filename。该参数是可选的,因为它也是用方括号括起来的。
该命令的名称和选项都是黑体字印刷。这意味着必须准确无误的键入它们。
参数是斜体字,这意味这必须用适当的值代替它(在本例中,指的是文件名或者目录名)。
参数后面接着省略号,这意味着可以使用不止一个参数(指定不止一个文件名)。因为参数本身是可选的,所以要更准确的话,可以说必须指定零个或多个文件名。
基于这条语法,下面列举了一些有效的ls命令。记住,单连字符选项既可以单独键入,也可以组合在一起使用一个单独的连字符:

ls -1
ls file1
ls file1 file2 file3 file4 file5
ls -Fl file1 file2
ls -F -1 file1 file2 

下面是一些无效的ls命令。第一个命令是无效的,因为它使用了一个未知的选项(-z)

ls -lz file1 file2 
接下来的Unix命令也是无效的,因为选项位于参数之后:

ls file1 -1 file2 
该例非常典型的说明了为什么必须严格遵循命令的语法。
通常,选项必须位于参数之前(不过也有例外,稍后将介绍)。因为单词file1没有以连字符开头,所以ls假定它是一个参数,并且假定它后面的都是参数。因此,ls认为指定了3个文件的名称,即file1,-1file2。当然,当前目录中没有名为-l的文件,所以命令的结果将不是我们所希望的。
最后两个语法针对更复杂情形。
(6)如果一个单独的选项和一个参数组合在一起,那么该选项和参数必须同时使用。
下面的一个例子(一个Linux版man命令的简化版本)描述了这一规则: 


man [-p paper] [-s sectionlistname… 

在这个例子中,如果希望使用-p选项,必须在该选项之后立即接上参数paper。同样,如果希望使用-S选项,必须在该选项之后立即接上sectionlist
可以看出,这种类型的Unix命令语法是“所有选项都必须位于参数之前”这一通用指导原则的例外。在这个例子中,参数paper位于选项-S之前是有可能的。
下面是最后一个Unix命令语法规则:
(7)由|(竖线)字符分开的两个或者多个项,表示可以从这个列表中选择一个项。
下面的例子,烤熟这一规则,这个例子示范了一个Linux版本的who命令的语法:

who [-abdhilmpqrstTu] [file | arg1 arg2]

该语法说明该命令可以使用一个名为file的参数,或者两个名为arg1 和arg2的参数。下面列举该命令的两个例子。其中,第一个例子指定file;第二个例子指定arg1arg2:

who /var/run/utmp
who am i 

需要注意的是,当拥有不止一个选项时,如何用竖线来描述它们。


7. 使用Unix手册学习命令语法 
在阅读印刷资料时,很容易看出哪些单词时黑体字,哪些单词时斜体字。但是,当在显示器上查阅联机手册时,可能看不到特殊的字体。
在一些系统上有黑体字字和斜体字;在另一些系统是,没有黑体字和斜体字。在不显示斜体字的系统上,通常使用下划线代替斜体字。您需要适应自己使用的特定系统,从而可以根据上下文推断哪些单词时参数。
典型的说明书页将解释每一个可能的选项和参数。但是作为一种语法摘要,一些版本的手册使用简化的形式,不会列出单个的选项,而时使用单词“option”表示。下面举一个例子,之前我们采用这种方式显示ls命令语法:

ls [-aAcCdfFgilLqrRstul] [filename
使用简化形式之后,语法将变成:

ls [option] [filename…]
不用担心,无论在语法摘要中是否能看到选项,在详细的命令描述中,都将列举并解释各个选项。

11. 如何学习众多的选项 
ls命令有18种不同的选项。其实,一些版本的ls命令甚至拥有更多的选项,其中许多选项不是所谓的—选项。那么如何学习如此众多的选项呢?最好的方法是值记住最重要的选项,当需要其他选项时,可以通过联机手册查询其他选项的使用方法。
Unix程序员的特征之一就是他们他们倾向于编写拥有许多选项的程序。此外,不同版本的Unix也会对同一个命令提供不同的选项,这种现象并不罕见。
前面使用过的ls命令取自一个特定类型Unix。其他系统的ls命令选项与此不尽相同。但是最重要的选项——也就是使用最多的选项,不会由于系统的不同而变化太大。
如果您正在学习一条命令,而且想了解该命令所有可能的选项和参数,那么您可以查阅系统的联机手册。
想一想钱买呢描述过的man命令的语法:

man [sectionname
man -f name...
man -k keyword...


由于该命令可以以3种不同的方式使用,所以很容易使用3种不同放入描述说明该命令的语法。
第一种使用man的方式是一个可选的section数字及一个或多个name值。第二种方式是使用-f选项及一个或多个name值。第三种方式是使用-k选项及一个或多个keyword值。

这些并不是man仅有的选项,只是man命令最重要的选项。在一些系统上,man拥有大量的选项。但是,对于日常工作来说,-f和-k是唯一需要使用的选项。如果希望知道自己的系统上man命令还有什么选项,可以查阅手册。

下面在举一个例子,可以使用whatis命令代替man -f,使用apropos命令代替man -k。这两种Unix命令的语法如下所示:

whatis name…
apropos keyword… 

该Unix语法表明,在使用其中任一命令时,要输入命令名称(whatisapropos), 后跟一个或多个参数。

沒有留言:

張貼留言