经过前面的学习,大概了解了计算机组成原理和操作系统的一些知识。尽管这些知识都是琐碎的,拼凑的,在以后的工作和学习中仍需进行深入的了解。但是这些预备知识对于准备跨入 Linux 大门的童鞋来说,应该是足够了。现在我们可以愉(ku)快(bi)的敲命令了,这篇文章就来对这几天学习的命令做一个总结。
在开始 Linux 的命令学习之前,不妨回顾一下操作系统有关的知识,这些知识在后面的学习中可能会用到,有必要再次了解。
1.Kernel 内核和系统调用
Kernel 是操作系统的核心,第一天中我们有说道操作系统的一些核心功能,比如进程管理、内存管理、文件系统、网络管理等,这些都是由内核提供的。这些功能是每个操作系统的基本功能,那些运行在操作系统上面的软件,都或多或少需要使用到内核提供的功能。因此我们这里可以换个角度理解内核的作用:将计算机硬件的计算能力抽象出来,并提供给上层软件调用。这种调用被称为系统调用。
系统调用,可以解释为调用操作系统提供的最底层API进行编程。但是对于程序员来说,系统调用太过底层和复杂,使用起来非常麻烦。这时我们就需要用到库(Library),库是操作系统对系统调用更高一层的抽象,通过调用库进行编程,比系统调用简单的多。这些操作系统的层次结构我们清楚了:Kernel 内核 -> 各种库 -> 应用程序。应用程序是建立在各种库的基础之上的。
2.Magic Number 魔数
我们编写的软件,也叫可执行文件。软件的本质上也是一个文件,只是可以被执行,那么操作系统怎么判断这个文件是否可以被执行呢?或者从哪里执行这个文件呢?这就要用到魔数。魔数,顾名思义,它是有魔力的,它的魔力在于:可以告诉操作系统这个文件是一个可执行文件还是普通的文件,以及其他的一些信息。
具体而言,魔数是在每一个文件的二进制代码的开头处,用来表示文件类型以及权限等的几个特殊字符,这些特殊字符的格式是固定的。双击某个应用程序,或者在 CLI 中输入命令回车后,Shell 就会将二进制文件提交给操作系统的内核 Kernel ,Kernel 就去寻找这个文件的魔数,从这个魔数去判断该文件是否可执行,或者有无执行权限等等。如果检测的要求合法,就会运行该文件,如果检测不合法,则拒绝执行。
3.工作目录
想必你已发现,只要我们处于操作系统中,就无时无刻不处于某一个目录中。我们完成的所有的操作,都是在某一个目录中完成的。这个目录也叫工作目录(Working Directory)。
这里留下一个问题:Linux 的基本哲学之一就是一切皆文件,那么目录是不是一种文件呢?文件名是不是一种文件呢?文件名和文件的存放位置是哪里?这些问题我也不懂,留在后序做解答。
说到工作目录,这里引入本文要介绍的第一个 Linux 命令:pwd(print working directory)。该命令用来在 Bash 上以字符串的形式输出用户当前所在的的工作目录。
4.Linux 文件系统介绍
Linux 使用的是层级文件系统,也可以叫做属性文件系统,根文件系统(Root File System)等等。是从一个根目录开始,向下蔓延的文件系统树。" / "表示根文件系统。绝大多数的 Linux 发行版都遵循 FHS 标准,FHS 表示是 Linux 标准委员会提出的文件系统层级标准,规定了 Linux 发行版必须创建哪些文件。因此我们几乎在所有的 Linux 发行版中,都可以看到一些相同的目录结构,比如 " /boot "、" /dev "、" /etc" 等等,下面将逐一介绍这些目录。
- /boot:用来存放系统启动相关的文件,如系统内核,grup(bootloader)等。
-
/dev:设备文件所在目录,Linux 上所有的硬件设备也被识别为文件。设备文件分为块设备和字符设备。
- /etc:配置文件存放的主要目录/home:用户的主目录,除 root 用户外,每个用户的默认主目录都是 /home 下的以用户名为目录名的分支。即:/home/USERNAME。root 用户的主目录在 /root 下,并不在 /home 中。
-
块设备:可以随机访问的设备。比如硬盘,可以从硬盘的任意位置读取数据。
-
字符设备:只能线性访问的设备,有顺序性。比如键盘,识别键盘上敲打的字符必须按照顺序访问,不能随意读取。
-
设备文件是特殊文件,没有大小, 设备上有主设备号和次设备号
-
- /lib:用来存放库文件。我们在上面对库进行了简单的介绍,知道了库就是操作系统从系统调用抽象出来,以提供给应用程序使用的接口。其实,库还分为动态库和静态库两种。
- 动态库(共享库):在 Windows 下的后缀名为 .dll,在 Linux 下的后缀名为 .so(Shared Object)。动态库文件在内存中只存在一份,如果几个软件同时依赖于某个库文件,他们使用的是同一份库文件。动态库的优势在于不需要重复载入,节约很大的内存空间。缺点是不方便程序的移植,具体说来,一个程序读过依赖于某个动态库执行,在将其移动到其他系统时,还要保证系统上有对应的库文件,否则程序无法执行。
- 静态库:区别于动态库,静态库属于程序的一部分,作为程序构成的一部分,随程序一起运行。由于静态库和程序是一个整体,因此如果多个程序使用相同的静态库文件,这个静态库文件也会在内存中存在多份。静态库的优势在于方便程序移植,缺点则是无法节约内存空间。
- /media 和 /mnt:系统的挂载点目录。在 Linux 下使用某个硬件设备,需要将这个设备关联到文件系统的某个节点上才能使用,这个过程就是挂载。通常在 /media 上挂在移动设备,在 /mnt 上挂在额外的临时文件系统,但是并没有严格的要求。
- /misc:杂项。
- /opt:早期是第三方软件的安装目录。
- /proc:伪文件系统。之所以叫伪文件系统,是因为这个目录是存放在内存放,而不像其他的目录存放在硬盘。既然是存放在内存上的,那么在关机后这个目录也就不存在了,它主要用来在操作系统开启后保存内核的映射文件。
- /sys:另一个伪文件系统,用来保存硬件设备相关的属性映射文件。
- /tmp:临时文件目录。这个目录每隔一段时间就会对其中没有被使用的文件进行清除。任何用户都可以在 /tmp 下创建文件,但是只能删除自己创建的文件,不能删除其他用户创建的文件。
- /var:用来存放可变化的文件。如 cache、log等。这些文件是在不断变化的,所以将它们存放在 /var 目录下。
- /bin:存放可执行文件。用户命令都在里面。
- /sbin:存放管理命令。
- /usr:为了方便用户使用操作系统而建立的目录,比如软件安装,帮助手册等。
- /usr/local:存放第三方软件。
5.Linux 文件命名的的规则
- 文件名长度不能超过255个字符
- 不能使用 / 当文件名,除了 / 之外,其他字符都合法
- 严格区分大小写
- 以 . 开头的文件为隐藏文件
6.常用命令
- ls(list):列出指定目录下的可见文件信息,默认为当前目录
- ls -l 或者 ll:列出完整的文件信息,包括文件的各种属性
- ll -h:在显示详细信息的时候,默认是以字节数进行显示,-h选项用来将字节数转换为淫类所熟悉的Kb、Mb、Gb等单位显示
- ll -a:显示所有文件,包括代表当前目录的 . 和代表父级目录的 ..
- ll -A:显示除去 . 和 .. 之外的所有文件
- ll -d:显示目标文件的详细信息,这个目标文件可以是目录或者普通文件
- ll -i:显示文件的索引节点。淫类是通过文件来找到某一个文件,而计算机是通过文件索引来找到有关文件
- ll -r:逆序显示
- ls -R:递归显示目录
- cd(change directory):切换目录
- cd DIR:切换到指定的目录。不加参数:回到用户主目录
- cd ~:回到用户家目录
- cd -:在当前目录和上一个目录之间来回切换
- type:判断命令的类型。
- type COMMAND:判断参数命令是内置命令还是外置命令
- 内置命令:Shell 中内置的命令
- 外置命令:在某个目录下,有一个与命令名称相对应的可执行文件,如 /bin
- ls 等同于 /bin/ls,ls 就是 /bin 下的一个可执行文件,通过运行这个文件可以列出当前目录下的子文件。
- 为什么可以省略 /bin/ls 前面的 /bin 呢?因为 /bin 被写入了 Linux 的环境变量。什么是环境变量,不用多解释了三。
- hash:查看 Shell 中缓存的命令
- 尽管有了环境变量,在 Shell 中执行命令很方便,但是如果每次执行命令的时候都要通过环境变量中的路径去执行命令,会不会很浪费资源呢?
- Shell 有种缓存机制,在 Shell 中输入的命令能被暂时缓存,下次执行该命令的时候直接从缓存中找,速度快很多。
- 使用 hash 命令可以看到 Shell 中缓存的命令以及使用他们的次数(hits)。
- 计算机中的经典语录:缓存为王(Cache is King)。
- date:显示时间或者修改时间
- 为什么操作系统上的时间可以在断电重新开机后保持不变呢?因为主板上有一个时间振荡器用来记录时间,这个时间也叫作硬件时间。操作系统每次启动时,都会从时间振荡器中读取时间,然后设置为系统时间。
- Linux 下的时间分为硬件时间(时钟)和系统时间(时钟)。
- 使用 date 命令查看的是系统时钟。要查看硬件时钟,需要使用 hwclock/clock。
- 获取命令帮助
- 大多数命令都有一个 --help 长选项,用来简要显示当前命令的帮助信息
- 内置命令:可使用 help COMMAN 查看帮助。
- 外部命令:可使用 COMMAND --help 查看帮助。
- man 命令:在命令帮助手册中查看,通过 man 命令查看的命令帮助信息十分详细。man 命令手册有章节之分。
- 用户命令
- 系统调用
- 库调用
- 特殊文件
- 文件格式
- 游戏
- 杂项
- 管理命令
- 如果多个章节都有相同的命令,需要手动指定在哪个章节查找,否则默认显示第一次匹配。使用 whatis COMMAND 可以查看命令的章节信息。
- man read
- man 2 read
- man 命令中的相关操作(以下均表示按键)
- space :向后翻屏
- b:向前翻屏
- enter:向后翻一行
- k:向前翻一行
- 输入 / + KEYWORD:向后查找
- 输入 ? + KEYWORD:向前查找
- n:查找后向后切换
- N:查找后向前切换
- q:退出帮助
- info COMMAND:更加详细的在线帮助文档。
- cal:获取日历file:辨识文件的类型
- cal 2099:获取指定年份的日历,默认为当前月份
- cal 12 2099:获取指定年份的指定月份日历
- tree:查看指定目录的目录树结构(这个挺帅的)
- echo:内容输出
- echo -e:识别转义字符。echo -e "memeda. mamada."
- print:可以直接识别转移字符,不用加选项。print "heheda xixida."
- mkdir:创建目录
- mkdir -p:递归创建。 mkdir -p memeda/heheda/xixida
- mkdir -v:显示创建过程
- 使用表达式:mkdir -p hehe/haha/{xixi,heihei}
- 表达式结合数学公式:mkdir -p hehe/haha/{a,b}{c,d}
- (a+b)(c+d) = ab + ac + bc + bd
- touch:修改文件的时间戳信息/创建文件
- touch FILE:修改文件的时间戳信息(同时修改最后一次访问时间戳和修改时间戳)
- 文件的时间戳信息有三种:文件的最后一次访问时间戳和修改时间戳都是可以改变的,文件的改变时间戳不可改变
- 文件修改时间
- 文件最后一次访问时间
- 文件改变时间
- 修改和改变的区别:
- 修改:文件内容作出改变
- 改变:文件的属性发生变化,如文件类型,文件所属组等
- touch -a FILE:改变文件的最后一次访问时间戳
- touch -m FILE:改变文件的修改时间戳
- touch 在修改文件的时间戳时,会首先判断文件是否存在,如果存在就修改文件时间戳信息,如果不存在,就创建一个新文件。因此我们经常使用 touch 来创建新文件。
- touch -c FILE:修改已存在文件的时间戳,如果文件不存在,则不做任何操作。
- touch -a -t 209912122359 FILE:改变文件的时间戳信息到指定的时间。这是黑客常用的伎俩。
- stat FILE:查看文件的时间戳信息
- nano FILE:创建一个文件并编辑文件内容
- 创建完成后按 ctrl + o 保存,ctrl + x 退出。
- rm FILE:删除文件
- 普通用户和管理员删除文件的区别:普通用户删除文件不会有提示信息,管理员用户会提示是否删除
- 管理员使用的 rm 命令是被修改过的命令,如果想使用原始的 rm 命令,可使用 /rm FILE
- rm -f:强行删除
- rm -r:递归删除目录
- cp:复制文件
- cp TARGET DIST:DIST 是目标目录/文件,如果是目录,就复制到该目录
- cp TARGET1 TARGET2 TARGET3 DIST:将多个文件复制到一个目录(注意不能将文件多对多的复制)。
- cp 要求最后一个参数必须是目录而不是普通文件。
- cp -r:复制目录,如果目标目录不存在就新建目录
- cp -i:忽略复制过程中的提示信息
- cp -p:复制文件,并保留源文件或目录的属性,包括所有者、所属组、权限与时间
- cp -a:复制并保留源文件所有的属性信息,常用于文件的备份
- cp LINK:默认情况下复制的是链接指向的文件,而非链接本身
- cp -d LINK:复制链接本身
- mv:移动文件
- mv TARGET DIST
- mv haha.txt xixi.txt:重命名文件
- mv -t DIST TARGET:移动文件,先指定目标,在指定源文件
- install:复制文件或创建目录
- install -d {meme,hehe}:创建目录
- install meme.md xixi/:复制文件
- install 只能复制文件,不能复制目录
- install 只能创建目录,不能创建文件
- cat:显示文件的内容
- cat FILE:顺序显示文件内容
- tac FILE:逆序显示文件内容
- cat -n:显示行号
- cat -E:显示结束符
- cat -T:显示制表符
- cat -v:显示所有的非打印字符
- cat:不加参数表示为从标准输入读取内容,并显示到标准输出
- cat 的注意些节:如果 cat 用做读取内容很长的文本,如 /etc/rc.d/rc.sysinit,那么在终端中只会显示一小块内容。我们可以使用 shift + pageup/pagedown 来从缓存区中读取内容,但是由于缓存长度是有限的,不一定能读取到全部内容。因此 cat 不适用于长文本的读取。
- more / less FILE:读取长文件内容,并能够进行翻屏
- more:只支持向后翻页
- less:支持和 man 命令一样的翻页操作
- head:查看文件的前 n 行,默认为10
- Linux 中以下两种格式都支持:
- head -n 99 memeda.txt
- head 99 memeda.txt
- tail:查看文件的后 n 行,默认为10
- 同上
- cut:抓取文本中的内容
- -d:指定分隔符
- -f:显示使用分隔符分隔后的第几个字段
- -f 1:显示第一个字段
- -f 1,2:显示第一个和第二个字段
- -f 1-3:显示前三个字段
- -d 和 -f 选项不可省略,选项的参数也不可省略
- sort:对文本中的内容进行排序,默认按照 ASCII 排序
- sort -n:按照数字排序
- sort -r:降序排序
- sort -t:指定分隔符
- sort -k:按照指定分隔字段为基准排序
- sort -t : -k 3 /etc/passwd -> 使用 : 分隔 /etc/passwd,并以第三个字段为基准进行排序
- sort -u:相同的信息只显示一次
- sort -f:忽略大小写
- uniq:去除重复行
- uniq:去除重复行并显示,默认只把相邻的重复作为重复行
- uniq -d:显示重复行
- uniq -D:显示所有重复行
- uniq -c:显示所有的行,并显示每行重复的次数
- wc FILE:文本统计
- wc -l:统计行数
- wc -L:最长的一行包含的字符数
- wc -w:单词数
- wc -c:字节数(空格也算在内)
- tr:字符转换
- tr "memeda" "MEMEDA" < /tmp/memeda.md:将 /tmp/memeda.md 中的 memeda 全部转换为 MEMEDA
- tr -d "memeda" < /tmp/memeda.md:删除 /tmp/memeda.md 中所有的 memeda
7.Bash 和其的一些特性(包括一些命令)
bash 也是一个命令,表示在当前的 Shell 中打开一个子 Shell。exit 命名表示退出当前 Shell 并回到上一个 Shell,如果上一个 Shell 已经是根 Shell,则退出当前用户。Linux 中每登录一个用户就会打开一个 bash,并且可以同时登陆多个用户。据此可以 su 之后 exit 又回到原先的用户 Shell。
bash 是命令行工具,除了 bash 之外,类似的还有 csh,ksh 等。值的注意的是 Shell 可以交替打开,如可以在 bash 中打开 csh,再在 csh 中打开 ksh。也就是说一个 Shell 的子 Shell 并不要求和原来一致。
bash 的一些操作技巧:
-
- ctrl + a:跳到命令的行首
- ctrl + e:调到命令的行尾
- ctrl + u:如果在光标命令的行尾,就删除这条命令。如果光标在某个字符上,就删除该字符之前的所有字符。
- ctrl + k:如果光标在某个字符上,就删除该字符之后的所有字符
- ctrl + l:清屏,等同于 clear
- ctrl + d:删除光标上的字符
命令历史:bash 会记录执行过的命令,使用上下箭头切换,也可使用 history 命令查看记录:
-
- history:执行过的命令的历史记录
- history -c:清空命令历史
- history -d 100:删除历史记录中的第100条命令
- history -w:将 history 保存到历史文件中(~ 下的 .bash_history)
经过执行的命令被存放在内存的缓冲区中,当用户正常退出时,会将缓冲区中的内容追加到 ~ 下的 .bash_history 中,因此下一次该用户登陆系统时,还可以继续使用 history。
历史命令的使用技巧:
-
- !n:执行 history 中的第多少条命令
- !-n:执行 history 中的倒数第几条命令
- !!:执行上一条命令
- !man:执行 history 中以 man 开头的命令(第一次匹配)
- !$:引用上一条命令的最后一个参数 -> cat /etc/passwd nano !$
- ESC + .:使用组合键引用上一条命令的最后一个参数
命令别名:
-
- alias:显示当前 bash 中所有的命令别名
- alias ALIAS = COMMAND:设置命令别名unalias ALIAS:撤销命令别名
- alias cls clear
- alias cddesk "cd ~/Desktop"
命令替换:类似于 PHP 中的魔术变量
-
- touch file-$(date +%F-%H-%M-%S).txt
- touch file-`date +%F-%H-%M-%S`.txt
- 命令替换可以使用 $() 或反引号 ``
文件名通配:
-
- *:任意长度的任意字符
- ?:单个字符
- [a-zA-Z]:指定范围中的字符
- [^a-z]:指定范围之外的字符
-
[:space:] :空格
-
[:punct:]:标点
-
[:lower:]:小写
-
[:upper:]:大写
-
[:alpha:]:大小写
-
[:digit:]:数字
-
[:alnum:]:字母和数字
- 示例:
-
- ls a*.txt
- ls ??memeda.md
- ls [:lower:][:digit:]/[:alpha:].md
- 以上是 Linux 中文件路径的通配符写法,和正则表达式有几分相似。
8.总结
这篇文章主要介绍了 Linux 的一些基本概念和常用命令,包括 Linux 的文件系统,以及一些常用的操作文件和目录的命令。最后介绍了 bash 的特性和一些使用技巧,需要不断的练习和复习,才能掌握上面的内容。
作者:Charleylla 转载请注明出处:http://www.cnblogs.com/charleylla/p/5972819.html