Linux下命令行(一)之指令的特点
笔者将要步入职场,目前在一家互联网企业实习,职位是系统管理员,公司的服务器部署环境全部是CentOS,目前使用的是版本6。笔者对Linux有非常浓厚的兴趣,但并非计算机专业出身,因此计算机基础并不是特别牢厚。这篇关于Linux指令的总结只适合有一定基础的初学者,烦请愤青绕道,大神勿喷。
首先说明,这里的总结并非来自于实践,而是根据笔者自己的感觉以及对网上大部分类似内容的总结。这里的意思是,只是做一个总结而已,对于参考的网络文章或者书籍会在后面列出,若有网友或书籍作者指责内容有雷同并要求删除,请指出。
作为一个Linux菜鸟,我觉得首先需要掌握的是关于Linux的一些理论知识,像文件系统、目录架构、进程原理、网络以及Linux哲学等等,内容繁多,学习压力其实还是蛮大的。在掌握了基础的理论知识后,我觉得一个Linuxer的水平主要表现在他对Linux指令的熟悉上,通过三两条指令搭配一些神奇的参数,并通过管道重定向连接的方式组合起来,来解决一个显示的问题,我相信还是非常有成就感的。
奈何Linux下指令很多,一个个掌握显然不显示,并且对于有不同需要的Linux用户需要掌握的Linux指令范围也相差甚大。比如,一个纯粹的Linux发烧友,他只需要不停地折腾Linux的安装、多系统共存等问题就已经很满足了;而在Linux下开发的程序员则需要掌握开发工具指令的适用,如gcc、gdb、make等等;此外,我相信绝大多数Linux桌面用户甚至很少会去使用Linux指令。那作为一个Linux系统管理员,需要掌握哪些基本的Linux指令工具呢?这是我进入培训后思考的第一个问题。
Linux下工具繁多,指令只怕超过上万,堪比一门语言的词汇量了。逐一记住每一条指令及其用法显然是不现实的,也没有意义,常人估计也做不到。所幸Linux下的指令都是一些英文单词或者几个单词的缩写拼接而成,比较容易根据字面意思猜测到它的用途,但是具体用法就只能参看manuel手册了,毕竟大多数指令得配合适当的参数才能准确完美的工作。
对于Linux下指令的学习,我越来越觉得不停地记指令及其选项的方式实在太笨。不根据Linux下指令的特点就去盲目记忆学习,效率是很低的,并且也很容易生厌,使得自己学习Linux的心愿受挫,这大概是Linux入门时最让人头疼的问题了。一直可惜,市面上和网络上都没有出现能够非常好的引导初学者入门Linux的书籍或资料,谁要是能找到,非常感谢能够分享。
(一)Linux下指令的特点
Linux下指令的特点我总结如下:
(1)指令格式:
$ command [options] [arguments]
其中,选项(options)和参数(arguments)都是可选的,但具有完全不同的意义。选项指定这条指令的执行方式,一个工具(或者说一个命令)通常有多重运行方式、可以在多重环境下运行,指令的选项的作用就是指令以何种方式来运行;而参数是指令操作的字符串所代表的数据源,可以是文件、目录、ip地址、设备名等任何对象,但通常参数应是具有实际意义字符串。
选项可以使用减号"-"和一个英文字符(包括大小写,Linux下命令行是严格区分大小写的)或者数字组成的字符串。比如-r、-1、-R等等;也可以是由两个减号开始加一个单词组成的长选项,如--help、--version等等;还可以是没有减号的单个字符,比如tar指令的选项就可以不加减号前导,但这种情况比较少见;更少见的情况是用加好"+"表示关闭某个选项,至此,你可以把指令的选项理解为某种开关,"-"号表示打开这个开关,而"+"则相反,表示关闭这个开关。这里说的还是一般情况,实际情况还需具体对待,比如对于chmod指令,加号"+"的意义显然就不是关闭某个开关这样的意思了。
虽说Linux下指令的格式不是很统一(这通常取决于工具的作者,显然Linux下的工具不是一个人写的),相同的参数对于不同的指令会有不同的意义,更是让人头疼不已,这在《UNIX痛恨者手册》里就有不少的批评。但是,基本上绝大多数指令的格式以及选项的含义还是比较统一的。对于异类,似乎唯一的办法就是遇到时具体对待,并且在使用中记忆。
(2)但字符选项可以合并。
当一条指令需要很多选项,且这些选项并不要求其后紧跟参数时,通常可以将这些选项合并在一起,只保留一个前导的减号"-",如下:
$ command -a -b -c -d filename # 等价于下面的
$ command -abcd filename # 实际上这种形式更常见
(3)有些指令的某些选项会要求紧跟其后带有一个特定的参数。
比如选项f通常要求在后面紧跟上一个文件名作为参数,比如使用tar解压一个tar包的指令可以如下:
$ tar -xf tarpackage.tar # 在当前目录下打开tar包tarpackage.tar
注意,选项f放在了选项x的后边,且其后紧跟文件名,并且将选项x和f合在了一起,另外选项前导的减号"-"对于tar指令来说是可以忽略的。
(4)分隔符很重要。
通常指令名、选项以及参数之间的分隔符(默认通常是空白符)是不可省略的;对于有些指令,选项和参数之间的空白符则是可有可无的;还有些指令会要求它的某些选项与其后的参数紧连在一起,之间不能有分隔符。
比如对于cut指令的d选项,后面要求跟上一个字符或字符串作为分割符(串)参数,通常会用引号把这个参数引起来,选项d和这个分隔符参数之间的空白符就是可有可无的:
$ cut -d ':' -f 2 /etc/passwd # 等价于下面的
$ cut -d':' -f2 /etc/passwd # 我觉得这个形式更好理解
上面cut指令的选项f也可以这么干,它指出应该把第几个域cut出来。
选项与其后参数之间不能有分隔符的一个例子登陆mysql服务器时通过选项p加密码,如下:
$ mysql -u root -p123456
当然,这里表示本地登陆,注意选项p和其后的密码之间不能有空白符。
有关分隔符的另一个需要注意的例子是dd指令,这个指令通常被用来建立一个文件,它的选项是不带前导符号"--"的单词,例如:
$ dd if=/dev/zero of=swapfile bs=4k count=256
这里if、of、bs、count都是dd指令的选项,它们都要求其后紧跟参数,选项与参数之间以等号"="间隔。这算是非常特殊的例子了。好在Linux下这种例外的例子不多,大部分的指令都遵循(1)中所说的格式。