[关闭]
@EncyKe 2016-11-17T07:11:21.000000Z 字数 17872 阅读 5136

手册:Linux

#手册 Linux



1. 简介

1.1. 版本分类

Linux 分为 内核版本发行版本,版本越老的 Linux 内核的安全性越高。

经典的 Linux 发行版本有以下几种——

1.2. 开源软件

开源软件
不经过编译的二进制脚本,代码是开放的。

1.3. 应用领域

1.4. 特点

2. 基础知识

2.1. 分区

2.1.1. 分区类型

分区
将硬盘分成几个不同的逻辑区域;
主分区
硬盘共 64 个空间,每个分区 16 个,故最多可分 4 个主分区(含扩展分区);一般多是 3 + 1(3 个主分区,1 个扩展分区);
扩展分区
不能写入数据,只能包含逻辑分区;
逻辑分区
除了不能写入启动信息,其它和主分区没区别;最多 23 个;

2.1.2. 分区原理

主引导记录 (Master Boot Record, MBR)
磁盘第一个扇区。扇区大小为 512 字节,其中 446 字节用于启动信息,64 字节用于分区,每 16 字节表示一个分区,故主分区 + 扩展分区最多只能有 4 个。
格式化
  1. 把整个分区分成等大小的数据块(4K 对齐,未存储满剩余部分被浪费不能使用);
  2. 在分区列表里建立二维索引表,记录了每个文件的 ID 号(I 节点 NODE),修改时间,权限,文件保存位置等;
  3. 格式化会清空数据,但其目的不是为了清空数据,而是为了写入文件系统;

2.1.3. 分区对比

2.2. Linux 分区及文件系统结构

挂载
把分区和盘符连接在一起的过程;
挂载点
把目录叫做挂载点,亦即盘符;

3. 操作

3.0. 为什么要使用终端?

3.1. 终端快捷键

快捷键 作用
[Tab] 进行命令补全(有唯一补全时按一次即补全,有多个时按两次可列出);
[Ctrl] + [C] 在错误地使用了一个命令,导致在终端里出现了你无法预料的情况后,想要立即停止并恢复到可控状态,可用此快捷键来强行终止当前程序,并不会使终端退出;
[Ctrl] + [D] 键盘输入结束或退出终端;
[Ctrl] + [L] 清屏;
[Ctrl] + [S] 暂定当前程序,暂停后按下任意键恢复运行;
[Ctrl] + [Z] 将当前程序放到后台运行,恢复到前台为命令 fg;
[Ctrl] + [A] 将光标移至输入行首,相当于 Home 键;
[Ctrl] + [E] 将光标移至输入行末,相当于 End 键;
[Ctrl] + [U] 将光标出代码直接删到行首;
[Ctrl] + [K] 删除从光标所在位置到行末;
[Ctrl] + [R] 在历史命令中搜寻;
[Alt] + [Backspace] 向前删除一个单词;
[Shift] + [PgUp] 将终端显示向上滚动;
[Shift] + [PgDn] 将终端显示向下滚动;
[↑] 恢复之前输入过的命令;

3.2. Shell 基础

Shell
即命令行解释器,用户可以用其来启动、挂起、停止甚至编写一些程序;

3.3. 常用命令

  • -e:后加反斜杠 控制字符
    echo控制字符
    • \e:启动颜色打印;
    • \e[1;:颜色开始;
    • \e[0m:颜色终止;
      30m:黑色;
      31m:红色;
      32m:绿色;
      33m:黄色;
      34m:蓝色;
      35m:洋红;
      36m:青色;
      37m:白色;

示例:echo -e "\e[1;31m 红色 \e[0m"

3.4. 脚本编写

  1. vim hello.sh
  1. #!/bin/bash
  2. # ↑必须写的一句↑
  3. echo "Hello, World! "
  1. bash hello.sh
  2. # 或者——
  3. chmod 755 hello.sh # 赋予执行权限
  4. ./hello.sh # 相对路径执行

3.5. 命令别名

  1. alias
  1. alias 别名='原命令'
  1. # 永久生效,需重启或者再追加 `source ~/.bashrc`
  2. vi ~/.bashrc
  1. # 临时生效,永久生效需从 `~/.bashrc` 处更改
  2. unalias 别名

3.6. 命令生效优先级

  1. 第一顺位:由绝对路径或者相对路径执行的命令;
  2. 第二顺位:别名;
  3. 第三顺位:Bash 内部命令;
  4. 第四顺位:由 $PATH 定义的目录查找顺序找到的第一个命令;

3.7. 历史命令

  1. history [选项] [历史命令保存文件]
  • -c:清空历史命令;
  • -w:把缓存中的历史命令写入保存文件 ~/.bash_history(历史文件默认保存 1000 条,可在 /etc/profile 中修改 HISTSIZE);
  • !n:追加后执行第 n 条历史命令;
  • !!:追加后执行上一条命令;
  • !字符串:追加后执行最后一条以该字符串开头的命令;

3.8. 输出重定向

见:标准输出设备

输出重定向
任何命令均可输出至文件;
标准输出
只保留正确的命令;
  1. 命令 > 文件
  1. 命令 >> 文件
标准错误输出
保留错误命令;
  1. 命令 2>文件
  1. 命令 2>>文件
同时输出
正确、错误同时输出;
  1. 命令 > 文件 2>&1
  2. # 或者——
  3. 命令 &> 文件
  1. 命令 >> 文件 2>&1
  2. # 或者——
  3. 命令 &>> 文件
  1. 命令 >> 文件1 2>> 文件2

3.9. 输入重定向

  1. wc [选项] [文件名]
  • -c:统计字节数;
  • -w:统计单词数;
  • -l:统计行数;

  • wc,然后输入文本,最后 [Ctrl] + [D] 即可统计上述三项参数;
  • wc < [文件名]< 可选,统计指定文件参数;
  • wc << [字符串]:字符串中的内容作为该命令执行的内容;

3.10. 逻辑符

  1. 命令1;命令2
  1. 命令1 && 命令2
  1. 命令1 || 命令2

示例:

  1. # 命令 1 执行正确了输出 yes,错误了输出 no;
  2. 命令1 && echo "yes" || echo "no"

3.11. 管道符

  1. 命令1 | 命令2

示例:

  1. # 把 ll 的结果分屏显示
  2. ll /etc | more
  1. # 统计服务器上连入的客户端
  2. netstat -an | grep ESTABLISHED | wc -l

3.12. 特殊符号

特殊符号 作用
# 表注释;
'' 单引号中的特殊符号都失去特殊含义成为字符串;
"" 双引号除 $\、反引号外,同单引号;
$ 用于调用变量的值;
$()/反引号 可引用系统命令,其包含的系统命令将被优先执行;
\ 转义符,在转义符后的特殊符号失去特殊含义,成为普通字符;

4. 命令

4.1. 命令格式

4.1.1. 起始符

  1. [当前登录用户@主机名 ~]#

4.1.2. 命令格式

  1. 命令 [选项] [参数]

4.2. 目录操作命令

4.2.0. 根目录详解

目录 目录对应信息
/ 根目录;
/bin 命令保存目录(普通用户使用);
/boot 启动目录;
/dev 设备文件目录;
/etc 配置文件目录;
/home 普通用户家目录;
/mnt 系统挂载目录,默认为空,可用于接入 USB、光盘等,另有 /media/misc 两个空目录可满足此需要,但建议用 mnt 即可;
/lib 系统函数库存放目录;
/root 超级用户家目录;
/tmp 临时目录;
/sbin 命令保存目录(超级用户使用);
/proc 内存挂载点,不可直接操作;
/sys 内存挂载点,不可直接操作;
/usr 系统软件资源目录;
/usr/bin 系统命令(普通用户);
/usr/sbin 系统命令(超级用户);
/var 系统相关文档内容;

见:文件系统层次结构标准

4.2.1. 列出目录内容

  1. ls [选项] [文件/目录]
  • -a:所有文件,包含隐藏;
  • -l:显示详细信息;
  • -d:查看目录本身属性;
  • -h:人性化显示文件大小;
  • -i:显示 iNode;

示例:

  1. # ls -l 缩写
  2. ll
  1. # 查看某一个目录的完整属性,而不是显示目录里面的文件属性
  2. ls -Al
  3. # 或者——
  4. ls -dl [目录]
  1. # 显示所有文件大小,并以普通人类能看懂的方式呈现;
  2. # 其中小 s 为显示文件大小,大 S 为按文件大小排序
  3. ls -AsSh

见:文件权限

4.2.2. 建立目录

  1. mkdir [选项] [目录名]
  • -p:递归创建;

4.2.3. 切换目录

  1. cd [目录]

示例:

  1. # 进入当前用户家目录
  2. cd ~
  3. # 或者——
  4. cd
  1. # 进入上次目录
  2. cd -
  1. # 进入上级目录
  2. cd ..
  1. # 进入当前目录,没什么用
  2. cd .

4.2.4. 查询当前目录

  1. pwd

4.2.5. 删除空目录

  1. rmdir 目录

4.2.6. 删除文件/目录

  1. rm [选项] 文件/目录
  • -r:删除目录
  • -f:不询问,强制删除;

示例:

  1. rm -rf [文件/目录]

4.2.7. 复制

  1. cp [选项] 源文件/目录 靶文件/目录
  • -r:复制目录;
  • -p:连带文件属性复制;
  • -d:连带链接属性复制(若源文件为链接);
  • -a:等于 -pdr

4.2.7. 剪切/重命名

  1. mv 源文件/目录 靶文件/目录
  1. mv 文件名1/目录名1 文件名2/目录名2

4.2.9. 链接命令

  1. ln [选项] 源文件 靶文件
  • -s:创建软链接,推荐使用;

见:硬链接 & 软链接

4.3. 搜索命令

4.3.1. 文件搜索

  1. locate 文件名
  1. find [搜索路径] [搜索条件]
  • -name:按文件名搜索,后加 文件名(使用通配符时要加引号,如:find /root -name "*what");
  • -iname:搜索文件名时不区分大小写,后加 文件名
  • -user:按所有者搜索,后加 用户名
  • -nouser:搜索没有所有者的文件,直接使用,常用来删除无用文件(内核产生及外来文件没有所有者,但需慎操作);
  • -atime:文件访问时间,后加 时间
  • -ctime:改变文件属性,后加 时间
  • -mtime:修改文件内容,后加 时间
    • 时间:-10 表十天内修改;10 表十天当天修改;+10 表十天前修改;单位:外加 min 等,默认为 d;
  • -size:文件大小,后加 文件大小
    • 文件大小:-25k 表小于25k;25k 表25k;+25k 表大于25k;单位:k、M、G,不加单位指扇区数据块(等同于 512k);
  • -inum:按 i 节点搜索,后加 数字ID
  • -a:与逻辑符;如:find . -size +20k -a -size -50k
  • -o:或逻辑符;
  • -exec 第二条命令 {} \;:表上一条命令执行后紧接着执行第二条命令,如:find . -size +20k -a -size -50k -exec ls -al {} \;

见:通配符

4.3.2. 命令搜索

  1. whereis [选项] 命令
  • -b:只查找可执行文件;
  • -m:只查找帮助文件;
  1. which 命令

见:环境变量

4.3.3. 字符串搜索

  1. grep [选项] "字符串" 文件名
  • -i:忽略大小写;
  • -v:排除指定字符串;

4.4. 帮助命令

4.4.1. man 命令

  1. man 查询对象

示例:

  1. # 查询这一对象有无不同级别
  2. # 再以 `man 数字 查询对象` 具体询问
  3. # 等同于 `whatis`
  4. man -f 查询对象
  1. # 查询与对象相关的所有信息
  2. # 等同于 `apropos 查询对象`
  3. man -k 查询对象

见:Manual

4.4.2. --help 命令

  1. 命令 --help

4.4.3. info 命令

  1. info 命令
  • [Enter]:进入子帮助页面(带有 * 号标记)
  • [u]:进入上层页面
  • [n]:进入下一个帮助小节
  • [p]:进入上一个帮助小节
  • [q]:退出

4.5. 压缩命令

4.5.0. 压缩格式机器说明

压缩格式 说明
*.zip zip 程序打包压缩的文件
*.rar rar 程序压缩的文件
*.7z 7zip 程序压缩的文件
*.tar ta 程序打包,未压缩的文件
*.gz gzip 程序 (GNU zip) 压缩的文件
*.xz xz 程序压缩的文件
*.bz2 bzip2 程序压缩的文件
*.tar.gz tar 打包,gzip 程序压缩的文件
*.tar.xz tar 打包,xz 程序压缩的文件
*tar.bz2 tar 打包,bzip2 程序压缩的文件
*.tar.7z tar 打包,7z 程序压缩的文件

4.5.1. zip 压缩

  1. zip 压缩文件名 源文件
  1. zip -r 压缩目录名 源目录
  1. unzip 压缩文件

4.5.2. gz 压缩

  1. gzip 源文件
  1. gzip -c 源文件 > 压缩文件
  1. gzip -r 源文件
  1. gzip -d 压缩文件
  2. # 或者——
  3. gunzip 压缩文件

4.5.3. bz2 格式压缩

  1. bzip2 源文件
  1. bzip2 -k 源文件
  1. bzip2 -d 压缩文件
  2. # 或者——
  3. bunzip2 [-k] 压缩文件
  • -k:保留压缩文件

4.5.4. tar 打包命令

  1. tar [选项] 源文件
  • -c:打包;
  • -x:解打包;
  • -t:查看包内容;
  • -z:压缩为 .tar.gz;
  • -j:压缩为 .tar.bz2;
  • -v:显示过程;
  • -f:指定打包文件名,后加打包文件名;
  • -C:指定解压缩路径,后加路径;

示例:

  1. -zcvf
  2. -zxvf
  3. -jcvf
  4. -jxvf

4.6. 关机、重启或注销命令

4.6.1. 关机命令

  1. shutdown [选项] 时间
  • -c:取消前一个关机命令;
  • -h:关机;
  • -r:重启;
  • 时间:now 或者 hh:mm;
  • 可在最后添加后台符 &,把该条命令放入后台执行;

4.6.2. 重启命令

  1. reboot
  2. # 或者——
  3. init 6

4.6.3. 注销命令

  1. logout

见:init 系统运行级别

4.7. 挂载、卸载命令

4.7.1. 挂载

  1. mount [选项] 设备文件名 挂载点
  • 无选项:直接 mount 表示查询已挂载项目;
  • -a:依据配置 /etc/fstab 的内容自动挂载;
  • -t:指定文件系统,后加 文件系统
  • -o:指定特殊选项,后加 特殊选项
    特殊选项:应用多个特殊选项时以 , 分隔
    挂载的特殊选项

4.7.2. 卸载

  1. umount 设备文件名/挂载点

示例:

  1. # 挂载光盘
  2. mkdir /mnt/自命名目录
  3. mount -t iso9660 /dev/sr0 /mnt/自命名目录
  4. cd /mnt/自命名目录
  1. # 卸载光盘
  2. umount /mnt/自命名目录
  3. # 或者——
  4. umount /dev/sr0
  1. # 挂载 U 盘
  2. mkdir /mnt/自命名目录
  3. fsdisk -l # 查询 U 盘设备文件名,sdb1 或者 sdc
  4. mount -t vfat 设备文件名 /mnt/自命名目录
  5. cd /mnt/自命名目录
  1. # 卸载 U 盘
  2. umount 设备文件名

4.8. 用户命令

  1. w 用户名
  • 无选项:查看系统当前信息;
  1. who 用户名
  2. # 或者——
  3. who am i
  4. # 或者——
  5. who mom likes
  • 无选项:查看用户名及终端登陆信息:
  • -a:打印能打印的全部;
  • -d:打印死掉的进程;
  • -m:同 am i, mom likes;
  • -q:打印当前登录用户数及用户名;
  • -u:打印当前登录用户登录信息;
  • -r:打印运行等级;
  1. last
  • 无选项:查询当前登录和过去登录的用户信息;默认读取 /var/log/wtmp 文件数据,查看有无黑客黑进;
  1. lastlog
  • 无选项:查询当前登录和过去登录的用户信息;默认读取 /var/log/lastlog 文件数据,查看有无黑客黑进;

4.9. 文件操作命令

  1. cat [选项] 文件名
  • -n:添加行号;
  • tac:倒序查看;
  1. nl [选项] 文件名
  • -b:指定添加行号的方式:追加 a 表示无论是否为空行,同样列出行号;追加 t 表示只列出非空行的编号并列出(默认方式);
  • -n:设置行号的样式:追加 ln 表示在行号字段最左端显示; rn 表示在行号字段最右边显示,且不加 0;rz 表示在行号字段最右边显示,且加 0;
  • -w:行号字段占用的位数(默认为 6 位);
  1. more 文件名
  2. # 或者——
  3. less 文件名
  1. head 文件名
  2. # 以及——
  3. tail 文件名
  • -n:追加数字表示自定义查看的行数,默认查看前/后 10 行;
  1. file 文件名

5. 术语索引

- 环境变量

环境变量
echo $PATH 后输出即为 Linux 的环境变量,即每一个被用户输入的命令都会被Linux 在这一环境变量路径下寻找并执行;故常用命令直接输入即可,不必使用可执行文件的绝对路径;自制的脚本命令需要提前放入环境变量才能使用短路径,否则一定要用绝对路径才可执行。

- 标准输出设备

标准输出设备
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出

- 文件系统层次结构标准

FHS (Filesystem Hierarchy Standard)
文件系统层次结构标准,多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。
主要定义了两层规范:第一层是 / 下面的各个目录应该要放什么文件数据(如 /etc 应该要放置设置文件,/bin/sbin 则应该要放置可执行文件等等);第二层则是针对 /usr/var 这两个目录的子目录来定义(如:/var/log 放置系统登录文件、/usr/share 放置共享数据等等)。

此处输入图片的描述

此处输入图片的描述

- 用户管理

Linux 是一个可以实现多用户登陆的操作系统,多个人同时登陆同一台主机,他们共享一些主机的资源,但他们也分别有自己的用户空间,用于存放各自的文件。但实际上他们的文件都是放在同一个物理磁盘上的甚至同一个逻辑分区或者目录里,但是由于 Linux 的 用户管理权限机制,不同用户不可以轻易地查看、修改彼此的文件。

root 权限
系统权限的一种,在 Linux 系统里,root 账户拥有整个系统至高无上的权利,比如新建/添加用户。与 SYSTEM 权限可以理解成一个概念,但高于 Administrator 权限。root 是 Linux 和 UNIX 系统中的超级管理员用户帐户,该帐户拥有整个系统至高无上的权力,所有对象他都可以操作,所以很多黑客在入侵系统的时候,都要把权限提升到 root 权限,用 Windows 的方法理解也就是将自己的非法帐户添加到 Administrators 用户组。更比如安卓操作系统中(基于 Linux 内核)获得 root 权限之后就意味着已经获得了手机的最高权限,这时候你可以对手机中的任何文件(包括系统文件)执行所有增、删、改、查的操作。
  1. sudo adduser peter
  1. ls /home
  1. su -l peter
  1. exit
  1. groups
  2. # 或者——
  3. groups <用户名>
  4. # 或者——
  5. cat /etc/group | sort
  1. sudo usermod -G sudo peter
  1. sudo deluser peter --remove-home
  1. touch file
  1. sudo chown aaa file
  1. echo "echo \"hello world\"" > file
  1. # 每个文件的三组权限(拥有者,所属用户组,其他用户)就对应这一个 "rwx",也就是 "7"
  2. chmod 700 file
  3. # 或者——
  4. # gou 分别表示 group、others、user,'+'、'-' 就分别表示增加和去掉相应的权限
  5. chmod go-rw iphone

- 文件权限

10 位文件权限
长命名方式显示
文件类型及权限

第 1 位:文件类型(- 文件,d 目录,l 软链接);
第 2-4 位:u 所有者;
第 5-7 位:g 所属组;
第 8-10 位:o 其他人;

文件类型
Linux 里面一切皆文件,正因为这一点才有了设备文件(/dev 目录下有各种设备文件,大都跟具体的硬件设备相关)这一说,还有 socket(网络套接字)和 pipe。
读权限 r
可用 cat 文件名 之类的命令来读取某个文件的内容;
写权限 w
表示可以编辑和修改发文件;
执行权限 x
通常指可以运行的二进制程序文件或者脚本文件,如同 Windows 上的 .exe 后缀的文件,不过 Linux 上不是通过文件后缀名来区分文件的类型。需要注意的一点是,一个目录要同时具有读权限和执行权限才可以打开,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息;
所属用户组权限
指所在用户组中的所有其它用户对于该文件的权限。

- 通配符

通配符
可用通配符进行模糊匹配搜索
通配符 作用
* 匹配 0 或多个字符;
? 匹配任意一个字符;
[] 匹配 [ ] 中的任意单一字符,如:find / -name "*[ab]" 表示搜索所有以 a 或 b 结尾的文件;
[!]/[^] 匹配除 [ ] 中的任意单一字符以外的字符,如:[^0-9]
[-] 匹配范围内任意单一字符,如:[0-9][a-z]
{,,...} 匹配 sring1 或 string2(或更多)其一字符串,如:{string1,string2,...}
{..} 匹配 { } 中全部字符,如:{1..10}
硬链接
相当于一个文件的两个入口;
软链接
相当于 Windows 桌面的快捷方式,源文件必须是绝对路径;

- Manual

Manual 级别
1:一般命令
2:系统调用
3:库函数,涵盖了 C 标准函数库
4:特殊文件(通常是 /dev 中的设备)和驱动程序
5:文件格式和约定
6:游戏和屏保
7:杂项
8:系统管理命令和守护进程
Manual 文本内容
    NAME(名称):该命令或函数的名称,接着是一行简介; SYNOPSIS(概要):对于命令,正式的描述它如何运行,以及需要什么样的命令行参数。对于函数,介绍函数所需的参数,以及哪个头文件包含该函数的定义; DESCRIPTION(说明):命令或函数功能的文本描述; EXAMPLES(示例):常用的一些示例; SEE ALSO(参见):相关命令或函数的列表; OPTIONS(选项); EXIT STATUS(退出状态); ENVIRONMENT(环境); BUGS(程序漏洞); FILES(文件); AUTHOR(作者); REPORTING BUGS(已知漏洞); HISTORY(历史); COPYRIGHT(版权);

- init 系统运行级别

init 系统运行级别
0:关机
1:单用户
2:不完全多用户,不含NFS服务
3:完全多用户
4:未分配
5:图形界面
6:重启

- 磁盘管理

  1. df -h

一般使用情况下,我们更多只是关心第一行的内容也就是环境中的 rootfs 或者物理主机上的 /dev/sda2。

物理主机上的 /dev/sda2 是对应着主机硬盘的分区,后面的数字表示分区号,数字前面的字母 a 表示第几块硬盘(也可能是可移动磁盘),你如果主机上有多块硬盘则可能还会出现 /dev/sdb,/dev/sdc 这些磁盘设备都会在 /dev 目录下以文件的存在形式。

rootfs (Root File System)
是 Ramfs(Ramfs 是一个非常简单的 Linux 文件系统用于实现磁盘缓存机制作为动态可调整大小的基于 ram 的文件系统)或者 tmpfs 的一个特殊实例,它作为系统启动时内核载入内存之后,在挂载真正的的磁盘之前的一个临时文件系统。通常的主机会在系统启动后用磁盘上的文件系统替换,只是在一些嵌入式系统中会只存在一个 rootfs ,或者像我们目前遇到的情况运行在虚拟环境中共享主机资源的系统也可能会采用这种方式。
  1. du -h

6. 趣味 Linux

6.1. 自带的 printerbanner

  1. # 以 50 宽度打印字母 A(纵向)
  2. printerbanner -w 50 A

6.2. banner

  1. # 下载安装
  2. sudo apt-get update
  3. sudo apt-get install sysvbanner
  4. # 打印字母ENCY(横向)
  5. banner Ency

6.3. 树状文件显示

  1. # 下载安装
  2. sudo apt-get update
  3. sudo apt-get install tree
  4. # 使用
  5. tree /

6.4. 天眼

  1. # 使用
  2. xeyes
  3. # 后台运行
  4. nohup xeyes &

6.5. 黑客帝国黑底绿字效果

  1. # 下载安装
  2. sudo apt-get update
  3. sudo apt-get install cmatrix
  4. # 使用
  5. cmatrix

6.6. 火焰

  1. # 下载
  2. sudo apt-get install libaa-bin
  3. # 使用
  4. aafire

6.7. 会说话的某动物

  1. # 安装
  2. sudo apt-get install cowsay
  3. # 使用(默认是头牛)
  4. cowsay 文本
  • -l:打印所有动物种类;
  • -f:追加动物种类;示例 cowsay -f elephant 文本 或者 fortune | cowsay -f daemon

附一:Linux 发展史

1. 操作系统

操作系统角色

操作系统始于二十世纪 50 年代,当时的操作系统能运行批处理程序。批处理程序不需要用户的交互,它从文件或者穿孔卡片读取数据,然后输出到另外一个文件或者打印机。

二十世纪六十年代初,交互式操作系统开始流行。它不仅仅可以交互,还能使多个用户从不同的终端同时操作主机。这样的操作系统被称作分时操作系统,它的出现对批处理操作系统是个极大的挑战。许多人尝试开发分时操作系统, 其中包括一些大学的研究项目和商业项目。当时有一个项目叫做 Multics,它的技术在当时很创新。Multics 项目的开发并不顺利。它花费了远超过预计的时间来完成,却没有在操作系统市场上占到多少份额。而参加该项目的一个开发团体——贝尔实验室退出了这个项目。他们在退出后开发了他们自己的一个操作系统——UNIX。

2. Unix 简史及 Linux 创生

UNIX进化史

UNIX 最初免费发布并因此在大学里受到欢迎。后来,UNIX 实现了 TCP/IP 协议栈,成为了早期工作站的操作系统的一个流行选择。

1990 年,UNIX 在服务器市场尤其是大学校园成为主流操作系统,许多校园都有 UNIX 主机,当然还包括一些研究它的计算机系的学生。这些学生都渴望能在自己的电脑上运行 UNIX。不幸的是,从那时候开始,UNIX 开始变得商业化,它的价格也变得非常昂贵。而唯一低廉的选择就是 MINIX,这是一个功能有限的类似 UNIX 的操作系统,作者 Andrew Tanebaum 开发它的目的是用于教学。

1991 年 10 月,Linus Torvalds(Linux 之父)在赫尔辛基大学接触 UNIX,他希望能在自己的电脑上运行一个类似的操作系统。可是 UNIX 的商业版本非常昂贵,于是他从 MINIX 开始入手,计划开发一个比 MINIX 性能更好的操作系统。很快他就开始了自己的开发工作。他第一次发行的版本很快吸引了一些黑客。尽管最初的 Linux 并没有多少用处,但由于一些黑客的加入使它很快就具有了许多吸引人的特性,甚至一些对操作系统开发不感兴趣的人也开始关注它。

Linux 本身只是操作系统的内核。内核是使其他程序能够运行的基础。它实现了多任务和硬件管理,用户或者系统管理员交互运行的所有程序实际上都运行在内核之上。其中有些程序是必需的,比如,命令行解释器 shell,它用于用户交互和编写 shell 脚本(.bat 文件)。

Linus 没有自己去开发这些应用程序,而是使用已有的自由软件。这减少了搭建开发环境而所需花费的工作量。实际上,他经常改写内核,使得那些程序能更容易在 Linux 上运行。许多重要的软件,包括 C 编译器,都来自于自由软件基金 GNU 项目。GNU 项目开始于 1984 年,目的是为了开发一个完全类似于 UNIX 的免费操作系统。为了表扬 GNU 对 Linux 的贡献,许多人把 Linux 称为 GNU/Linux(GNU 有自己的内核)。

1992-1993 年,Linux 内核具备了挑战 UNIX 的所有本质特性,包括 TCP/IP 网络,图形界面系统 X window,Linux 同样也吸引了许多行业的关注。一些小的公司开发和发行 Linux,有几十个 Linux 用户社区成立。1994 年,Linux 杂志也开始发行。

Linux 内核 1.0 在 1994 年 3 月发布,内核的发布要经历许多开发周期,直至到达一个稳定的版本。

UNIX 大事记:

1965 年,Bell 实验室、MIT、GE(通用电气公司)准备开发 Multics 系统,为了同时支持 300 个终端访问主机,但是 1969 年失败了
刚开始并没有鼠标、键盘,输入设备只有卡片机,因此如果要测试某个程序,则需要将读卡纸插入卡片机,如果有错误,还需要重新来过;Multics: Multiplexed Information and Computing Service;

1969 年,Ken Thompson(C 语言之父)利用汇编语言开发了 FIle Server System(Unics,即 UNIX 的原型)
因为汇编语言对于硬件的依赖性,因此只能针对特定硬件; 只是为了移植一款“太空旅游”的游戏;

1973 年,Dennis Ritchie 和 Ken Thompson 发明了 C 语言,而后写出了 UNIX 的内核
将 B 语言改成 C 语言,由此产生了 C 语言之父; 90% 的代码是 C 语言写的,10% 的代码用汇编写的,因此移植时只要修改那 10% 的代码即可;

1977 年,Berkeley 大学的 Bill Joy 针对他的机器修改 UNIX 源码,称为 BSD (Berkeley Software Distribution)
Bill Joy 是 Sun 公司的创始人;

1979 年,UNIX 发布 System V,用于个人计算机

1984 年,因为 UNIX 规定:“不能对学生提供源码”,Tanenbaum 老师自己编写兼容于 UNIX 的 Minix,用于教学

1984 年,Stallman 开始 GNU (GNU's Not Unix) 项目,创办 FSF (Free Software Foundation) 基金会
产品:GCC、Emacs、Bash Shell、GLIBC;倡导“自由软件”;GNU 的软件缺乏一个开放的平台运行,只能在 UNIX 上运行;自由软件指用户可以对软件做任何修改,甚至再发行,但是始终要挂着 GPL 的版权;自由软件是可以卖的,但是不能只卖软件,而是卖服务、手册等;

1985 年,为了避免 GNU 开发的自由软件被其他人用作专利软件,因此创建 GPL (General Public License) 版权声明

1988 年,MIT 为了开发 GUI,成立了 XFree86 的组织

1991 年,芬兰赫尔辛基大学的研究生 Linus Torvalds 基于 gcc、bash 开发了针对 386 机器的 Linux 内核

1994 年,Torvalds 发布 Linux-v1.0

1996 年,Torvalds 发布 Linux-v2.0,确定了 Linux 的吉祥物:企鹅

3. 人物

  1. Ken Thompson:C 语言之父和 UNIX 之父;
  2. Dennis Ritchie:C 语言之父和 UNIX 之父;
  3. Stallman:著名黑客,GNU 创始人,开发了 Emacs、gcc、bash shell;
  4. Bill Joy:BSD 开发者;
  5. Tanenbaum:Minix 开发者;
  6. Linus Torvalds:Linux 之父,芬兰赫尔辛基大学研究生;

4. Linux 与 Windows

5. X Window

相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形界面的,我们通常在 Unix/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件,类似 Windows 95 之前的 Windows 的图形界面实则也只是运行在 DOS 环境的一套软件。而 Linux 上的这套软件以前是 XFree86,现在则是 xorg (X.Org),而这套软件又是通过 X 窗口系统(X Window System,也常被称为 X11 或 X)实现的,X 本身只是工具包及架构协议,而 xorg 便是 X 架构规范的一个实现体,也就是说它是实现了 X 协议规范的一个提供图形用户界面服务的服务器,就像实现了 http 协议提供 web 服务的 Apache。如果只有服务器也是不能实现一个完整的桌面环境的,当然还需要一个客户端,我们称为 X Client,像如下几个大家熟知也最流行的实现了客户端功能的桌面环境 KDE、GNOME、XFCE、LXDE。这也意味着在 Linux 上你可以自己选择安装不同的桌面环境,甚至可以定制自己的专属桌面。

桌面环境区别

6. Terminal

通常在我们使用 Linux 时,我们并不是直接与系统打交道,而是通过一个叫做 Shell 的中间程序来完成的,在图形界面下为了实现让我们在一个窗口中完成接受用户输入和显示输出,Linux 系统还提供了一个叫做终端模拟器的程序 (Terminal),下面几个比较常见的终端模拟器,如:gnome-terminal、kconsole、xterm、rxvt、kvt、nxterm 和 eterm。不过要注意的是这里所说的终端 (Terminal) 和控制台 (Console) 是有区别的。

终端本质上是对应着 Linux 上的 /dev/tty 设备,Linux 的多用户登陆就是通过不同的 /dev/tty 设备完成的,Linux 默认提供了 6 个纯命令行界面的 Terminal,准确的说这里应该是 6 个 virtual consoles 来让用户登录,在物理机系统上你可以通过使用 [Ctrl] + [Alt] + ([F1] - [F6]) 进行切换,当你切换到其中一个终端后想要切换回图形界面,你可以按下[Ctrl] + [Alt] + [F7] 来完成。

7. Shell

通常在图形界面中对实际体验带来差异的不是上述的不同发行版的各种终端模拟器,而大都是这个 Shell(壳),有壳就有核,这里的核就是指的 UNIX/Linux 内核,Shell 是指“提供给使用者使用界面”的软件(命令解析器),类似于 DOS 下的 command(命令行)和后来的 cmd.exe。普通意义上的 Shell 就是可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统底层的细节。同样的 Unix/Linux 下的图形用户界面 GNOME 和 KDE,有时也被叫做“虚拟 shell”或“图形 shell”。

Unix/Linux 操作系统下的 Shell 既是用户交互的界面,也是控制系统的脚本语言。当然在这点也有别于 Windows 下的命令行,虽然也提供了很简单的控制语句。在 Windows 操作系统下,可能有些用户从来都不会直接的使用 Shell,然而在 UNIX 系列操作系统下,Shell 仍然是控制系统启动、X11 启动和很多其他实用工具的脚本解释程序。

在 UNIX/Linux 中比较流行的常见的 Shell 有 bash、zsh、ksh、csh 等等,Ubuntu 终端默认使用的是 bash,默认的桌面环境是 GNOME 或者 Unity(基于 GNOME)。

Linux 下使用最广泛的 C/C++ 编译器是 GCC,大多数的 Linux 发行版本都默认安装,不管是开发人员还是初学者,一般都将 GCC 作为 Linux 下首选的编译工具。

8. 建议学习路径

建议学习路径


附二:参考


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注