操作系统的功能:
存储管理、进程和处理机管理、文件管理、设备管理、用户接口
[mengqc@localhost ~]$ 是shell主提示符。其中
- “mengqc”表示当前用户名
- “localhost”是默认的主机名
- “~” 表示默认用户主目录
- “$ ” 表示当前用户是普通用户。对于超级用户来说,该位置出现的标示是“# ”。
linux操作系统常用命令
ls:查看当前目录下的文件夹
- -a:列出隐藏文件,-A:隐藏. ..文件
- -l :详细信息
- -t:修改时间排序
- -n:uid gid
- -r:倒序排列
- -s:打印每个文件以block为单位打印大小
- ll=ls -l
data:显示时间
cal:显示日历
passwd:更改密码
cp -f file1 file2:复制文件
who:显示谁在登录以及时间
- $:普通用户。
- #:root。
pwd:查看当前路径。
man ls :ls的帮助文档。
>;输出重定向,如果一个文件存在,删除后重新建立一个文件。
>>:输出重定向,如果一个文件存在,则追加到原文件末尾。
cat:打开一个文件
history:打开键入的命令列表。
打开后用!+ 编号 即可执行;!!:运行上一个命令;!-n:运行倒数第n个个命令;!cmd:运行cmd开头的命令。
当敲长命令时,输入几个字母+tab键,可以实现移动补充。
linux用户和组
介绍:登录用户是进入Linux的途径,系统中将用户看作是32位的二进制数,即是一个userID,用户信息存储在/etc/passwd中,root的ID是0;出于安全考虑,显示密码的第二个字段显示为X,密码存储在/etc/shadow文件中。
passwd文件:
用户名|x|用户id|用户2所在组id|备注信息|家|登录shell
- 一般用户:id>=500
- 超级用户:id=0
- 系统用户:id<500
shadow文件:
用户名:加密密码:最近更改密码的日期:密码不可更改的天数:密码更改期限前的警告时间:密码过期的宽限时间:账号失效日期:保留字段
注:数字是距离1970.1.1多少天到现在
添加用户useradd、adduser
- useradd username:添加用户
- passwd username:更改用户密码
注:此命令实现了1.给用户分配最大的id号 2、在passwd文件中添加一行 3、在/home/下创建用户的家 4、在/etc/group/下添加用户的组
修改用户usermod
- -c <备注> 修改用户帐号的备注文字。comment
- -d <登入目录> 修改用户登入时的目录。
- -e <有效期限> 修改帐号的有效期限。
- -f <缓冲天数> 修改在密码过期后多少天即关闭该帐号。
- -g <群组> 将用户只存在到新的组
- -G <群组> 将用户再加到别的次要组上
- -l <帐号名称> 修改用户帐号名称。
- -L 锁定用户密码,使无效。
- -s 修改用户登入后所使用的shell。
- -u 修改用户ID
- -U 解除密码锁定。
- 删除用户userdel
- -r 删除用户所有信息
- -f 删除用户主目录和邮箱 su命令:
su root:切换用户。
注:普通用户向根用户和其他用户需要输入口令,超级用户向普通用户跳转不需要输入口令。
用户组:用户组文件的路径在/etc/group/下,用户组也有/etc/gpasswd
group文件内容:groupname:密码:groupID:用户列表
gshadow文件内容:gname:password:管路员列表:成员列表
添加用户组 groupadd
- groupadd 注:添加用户组;
- groupdel 注:删除用户组;
- groupmod 注:修改用户组信息
-n 修改用户组名
groups 注:显示用户所属的用户组
grpck grpconv 注:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;
grpunconv 注:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件;
gpasswd -a 向名为 group 的组中添加用户 user
-d 从名为 group 的组中移除用户 user。
注:这里有关组安全的问题需要注意,组密码是当组中大于一个用户时,在组安全问题中被提出的,细节之后自己好好看看。
文件和目录:
普通文件:文本文件 二进制文件 数据文件
目录文件:I结点/文件名成对存在
i结点:存储文件相关的属性
文件名:存储的是一个字符串,标识该文件
如此做的目的是文件瘦身
设备文件:Linux把设备看作文件,实现设备无关性
符号链接文件:快捷方式
文件控制块:FCB,在linux中就是I结点
Linux树状目录结构
- bin:目录包含二进制(binary)文件的可执行程序。
- sbin:目录中存放用于管理系统的命令。:root权限
- boot:用于存放引导系统时使用的引导文件,有镜像文件等
- etc:linux系统配置文件,
- systemd:配置文件目录
- hosts:ip与名字的对照表
- services:定义系统服务与端口的对应关系
- profile:系统全局环境变量配置文件
- root:目录是超级用户的目录。
- dev:设备文件
- lost+found:目录中存放系统非正常关闭时正在处理的文件,以便下次系统启动时予以恢复。
- home:目录是用户起始目录的基础目录。通常,用户的主目录就保存在该目录中。
- lib:目录中保存程序运行时使用的共享库。
- mnt:目录中存放安装文件系统的安装点。挂载点。linux可以访问机器上的所有分区,只要在授权的情况下
- /run和/media目录使用来自动挂载的目录
- proc:目录实际上是一个虚拟文件系统。
- tmp:目录用于存放程序运行时生成的临时文件。
- usr:目录中包含了多个子目录,其中保存系统上一些最重要的程序,可供所有用户共享。
- lib64:64位操作系统的函数库
- src:核心源代码的位置
- sbin:超级用户才可以执行的命令:如磁盘修复等
- bin:用户可执行的命令
- var:包括系统正常运行时要改变的数据。
- log:存放各种应用程序的日志信息
绝对路径名:从/下开始,即root目录下实现绝对目录
相对路径名:./表示当前目录下 ../表示父目录
工作目录:用户的当前目录
主目录:注册用户是创建的文件时的总目录,在/home下
改变工作目录
① 将当前目录改到/home/liuzh:
$ cd /home/liuzh
② 将当前目录改到用户的主目录:
$ cd 或 cd ~
③ 将当前目录向上移动两级:
$ cd ../..
④ 进入cauc的主目录:
$ cd ~cauc
⑤ 返回刚才的目录,即上一个工作目录
$ cd —
ls命令列出指定目录的内容
chmod命令
只有文件主或超级用户root才有权用chmod命令改变文件或目录的存取权限。
umask命令:
文件的权限是由666-掩码实现的
cp
-a:保留组信息
-r :复制子目录下的文件
-i:交互式复制
-s:复制为符号链接文件,注意,这里是赋值为符号链接文件
rm
-i:交互式删除
-rf:全部删除
mv 文件或目录 文件或目录
mkdir
-m 700 directory
-p 如果上层目录不存在也进行创建
rmdir
-p :删除此目录以上的所有空目录
cat
-n 显示行号
more
-c 清屏
-10 显示10行
-d 显示百分比
/字符串:向下搜索字符串
less 分屏显示文件
group
-g:添加用户到用户组
-ag:追加用户
head
-5 :显示前5行
-v:显示文件名
--bytes=-100 :显示最后一百个字节其他的所有内容
tail
-5 :显示最后5行
-n +10 :显示第10行开始后的所有内容
-c 100 :显示最后一百个字符
gzip
-r:递归压缩
-dv :解压文件并且显示百分比
uzip :解压zip文件
tar:
-cvzf 归档名.tgz 被归档的文件
-xvzf .tgz 解压
注:硬链接和软链接的区别是什么???
硬连接:创建一个文件的时候,首先在磁盘上申请一块空间,然后在目录文件下创建一个文件,这里面存储的是文件名+I结点号,这个文件指向内存中创建的i结点,硬连接的话,在目录上新建了一个文件,但是他们指向了同一个i结点,所以她们的i结点号是相同的。
软链接:创建了一个链接文件,是实实在在的一个属性为l的文件,系统分配新的节点号,磁盘中创建一个文件,文件内容是被链接文件的文件目录,这时候,如果删除被链接文件,是删除了文件目录下的文件名,而软链接的内容就是定向到这个文件下,所以删除文件后,软链接就找不到了。软连接的权限是777。
eval:
将后面的命令,进行相应的变量替换和命令替换,替换的结果作为一个新的命令行输出,并执行
例:
[root@localhost etc]# echo $cmd
echo a
[root@localhost etc]# eval $cmd
a
expr
例子: `expr $1 + 1` 注意:运算符前后有空格
[root@localhost /]# set 1
[root@localhost /]# `expr $1 + 1`
bash: 2: command not found
[root@localhost /]# echo `expr $1 + 1`
2
awk
模式:awk 'BEGIN { command } Pattern{ command } END{ command }'
每一行的数据复制给$0 ;一行内空格分开的值从$1开始一次
echo -e "1\n2" | sort -rn | awk '{ x+=$0 ;} END{ print x}'
echo
-e:激活转义字符
- sort :对输入流进行行排序
- -b:忽略每行前面开始出的空格字符;
- -c:检查文件是否已经按照顺序排序;
- -d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
- -f:排序时,将小写字母视为大写字母;
- -i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
- -m:将几个排序号的文件进行合并;
- -M:将前面3个字母依照月份的缩写进行排序;
- -n:依照数值的大小排序;
- -o<输出文件>:将排序后的结果存入制定的文件;
- -r:以相反的顺序来排序;
- -t<分隔字符>:指定排序时所用的栏位分隔字符;
mkfs
- -t<文件系统类型>:指定要建立何种文件系统;
- -v:显示版本信息与详细的使用方法;
- -V:显示简要的使用方法;
- -c:在制做档案系统前,检查该partition是否有坏轨
进程管理
- Ss:有子进程
- S<:优先级高
- SN:优先级低
- SR+:
对于并发的程序,通过fork();生成子进程后,资源是两个进程之间各赋值了一份,所以两个进程之间并不影响各进程值的结果。
Linux shell脚本变量的使用
shell有两种执行命令的方式:
- 交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。
- 批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。
我们要知道bash和sh不是一个东西,我们需要了解,bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行
编写shell的一般习惯:
功能;作者;版本信息;历史记录;特殊的命令用绝对路劲表示;预先申明和设置脚本运行时的环境变量;
sheel的变量类型:
- 局部变量:仅仅用于创建的shell中
- 环境变量:由子shell继承
- shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
shell用$来解析shell变量;
变量赋值 :=;=两边不能有空格
创建变量:shell变量直接定义;环境变量是先定义一个shell变量,然后将export转换为环境变量
列出环境变量:set
列出已经被导出为环境变量的变量:env
export:实现了将父进程的私有数据转到公有区,当运行一个脚本的时候,实际上是进入了一个新的shell环境,也可以说是一个新的进程,这个进程由父进程创建。当export后,就可以将公有区的数据给子进程再复制一份了,注意这不是fork。
shell中一些比较特殊的变量:
特殊变量含义
$0
当前脚本的文件名
$n
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#
传递给脚本或函数的参数个数。
$*
传递给脚本或函数的所有参数。
$@
传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?
上个命令的退出状态,或函数的返回值。
$$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
注:这些变量我们留在这里备份,有用到就可以查。
HOME:用户主目录的全路径名。如/home/myname
LOGNAME:即用户注册名
PWD:当前工作目录的路径。
PATH:shell查找命令的路径(目录)列表,各个目录用冒号(:)隔开。 用户可以设置它: $ PATH=$PATH:$PWD
PS1:shell的主提示符。 $ PS1="$LOGNAME> "
SHELL:当前使用的shell。通常,它的值是/bin/bash。
TERM:终端类型。
MAIL:系统信箱的路径。
wc [选项] 文件…
说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。
该命令各选项含义如下:
- c 统计字节数。
- l 统计行数。
- w 统计字数。
vi
进入文本编辑的方式
- i I
- a A
- o O
光标移动
右移 方向键、l
左移 h、方向键
上移:
-:上移到行开头
k
Ctrl+P
方向键
移动到当前行的第一个字符:
- 0:不论是否是空白字符
- ^:费空白字符
移动到行尾:$
光标移动到第几行 :
Ctrl + G:显示行数
行号 G
移动那到下一个词的开头:w W
移动到前一个词的开头:b B
如果光标在一个词上,就移动到词尾:e E
文本修改
- 删除光标所在的字符:
- x:删除光标所在的字符
- X:删除光标前面的字符
- nx,从光标前面的字符开始,向左删除n个字符
- 删除光标所在的整行 dd
- 从光标开始删除到行尾 D
- 删除从光标位置+光标移动命令到大的位置
d0:删到行首
d3l:又删三个字符
d$:删到行尾
d5G:删到第5行
dw:删到词末尾
dL
dH
复员命令
回到插入或删除得上一个状态:u
恢复到刚开始编辑状态:U
修改命令:
取代命令:
r:用随后输入的字符取代光标所在的位置
R:相当于r的重复使用
替换命令:
s:用随后输入的字符取代光标所在的位置
S:用随后输入的字符替代整行
文本行合成 :J:把当前行与下一行和成一行
文本移动命令:
>:
>>
<
<<
!+光标移动命令+linux命令
编辑文件
字符串搜索:
- f 字符
- F 字符
- /字符串/位移
- ?字符串?位移
字符串替换:
一般格式:g/模式/命令
g/s1/p:打印包含所有s1的行
g/s1/s//s2
shell使用
成组命令:
- {空格 命令1;命令2;}
- (命令1;命令2)
字符串匹配
grep:标准的正则表达式匹配
egrep:扩展的正则表达式匹配 相当与 -F
fgrep:快速对字符串进行匹配 相当与 -E
- -f file :从文件中读取匹配模式进行匹配
- -i:忽略大小写
- -l :列出匹配模式的文件名,而非打印
- -q:如果匹配了,grep会静默的离开,将其不匹配的行写入标准输出,否则不成功
- -v:显示不匹配的行
shell语言可以说是文本处理语言,但是它应该具备一定的运算能力
变量
环境变量:全局变量,会继承
普通变量:局部变量,不会继承
常量
对变量的管理有 readonly 和 export
shell变量的创建没有啥要求,是一种边定义边赋值的变量,需要的时候直接变量等于什么就好了,例如a=sdad
因为我们说sheel变量就是给一个信息片创建的名字,它没有说什么浮点数之类的,所以说算术运算我们需要在(())中实现,
他对变量的类型只有环境变量等,而且创建环境变量还需要export 普通变量
数组的创建
对于数组的创建一种办法直接就是
a[0]=1
a[1]=2
引用的时候是${a[0]},${a[1]}
或者你可以实现用declare
root@kali:/mnt/bdshare# declare -a c
root@kali:/mnt/bdshare# echo $c
root@kali:/mnt/bdshare# echo ${c[0]}
root@kali:/mnt/bdshare# c[0]=1
root@kali:/mnt/bdshare# echo ${c[0]}
1
root@kali:/mnt/bdshare# echo ${c[1]}
其实没必要declare,想让他是数组就直接写成数组的形式就可以了
或者用圆括号 c=(e1 e2 e3),引用时c[0]
set命令
不加参数:显示已经定义的全部变量
设置指定位置参数
set 1 2 3:表示$1=1,$2=2,$3=3
env可以显示环境变量:后面还有
unset 用于删除变量和函数
- -v 删除变量
- -f 解除指定的函数
替换运算符
echo ${d:-word}:如果变量存在且非空,返回值,否则返回word,use to test the varible exists or null
echo ${d:+word}:如果存在and非空,返回word,to test the exist of varible
echo ${d:=word}:如果存在且非空,返回值,否则,赋值为word,return word
echo ${d:?word}:if exist or is null,print word,and exit the script or command
above all,":" could is choosed or is not choosed,if not is choosed,cancel the option of null or not null
如果一个变量赋值是一个文件夹或者是一个目录,你去cat 或者cd的话是可以实现的,因为他会解析字符串,其实就和我们输入的字符串是一个道理,你把它当作你的文件或目录就行了。
环境变量和普通变量的区别我来好好说一下
1,变量就是给一个信息片创建的名字,那就像是一片空间的数据,引用他就可以了
2,我们说操作系统中的用户环境是怎么构成的?在用户注册过程中,系统首先做的是创建用户环境,所有的进程都有独立且不同与程序本身的环境,linux环境是由许多变量以及这些变量的值构成的,
在操作系统中进程是怎么构成的呢?程序+进程控制块+数据,一个用户环境其实就是一个进程,当你创建多个用户的时候,在不同用户之间切换,其实就是进程之间的切换了。这些变量和变量的值决定了用户环境的外观,shell环境包括shell类型,主目录。
输入输出命令
read:从标准键盘上输入数据
read -p 提示变量名
root@kali:~# read -p "hahaha" x
hahahadsd
echo:直接显示后面的变量名和字符串
条件测试:$1是指输入的第一个参数
三种形式:
- test -f "$1"
- [ -f "$1" ]
- [[ -f "$1"]]
文件方面的测试
- -f: 普通文件
- -d:目录文件
- -b:块设备文件
- -s:文件长度>0true
- -r:可读
- -w:可写
- -x:可执行
- -p:pipe文件
- -c:字符文件
- -e: 文件存在
字符串方面的测试:注意:符号前后有空格
-z s1:空为真
-n s1:>0 true
s1 = s2 :true
s1 != s2
s1 < s2
s1 > s2
数值方面的测试
n1 -eq n2:==
n1 -ne n2: !=
n1 -le n2: <=
n1 -lt n2: <
n1 -ge n2: >=
n1 -gt n2: >
逻辑运算符
!,-a, -o
\(表达式\):整体判断
算术运算
(( 算术表达式)):对于这个,只有加入$((算术表达式))才能输出值
let "算术表达式"
例子:
root@kali:~# read x y
1 2
root@kali:~# echo $((x+y))
3
root@kali:~# echo $((z=x+y))
3
root@kali:~# echo z
z
root@kali:~# echo $z
3
root@kali:~# let "z=x*y+y"
root@kali:~# echo $z
4
双引号:除$,"",\,之外均作为普通字符对待
单引号:将所有得到字符都看做普通字符对待
到引号:将其中的内容解析为shell命令,有两种形式
x=`pwd`;将pwd解析的值作为变量x的值
x=$(pwd);和上面是一个道理
顺序执行:;
逻辑与:&&:这个逻辑与是命令之间的与,上一个与是条件测试的与
逻辑或:||
if控制结构
style1:
if 测试条件
then
command1
else
command2
fi
style2:
if 测试条件
then
command1
elif 测试条件
then
command2
else
command3
fi
while语句
while 测试条件
do
command
done
shift命令:将位置参数右移一位
until语句(测试条件为假时,才循环,为真是才终止循环)
until 测试条件
do
command
done
for语句
for 变量 in 值表
do
command
done
for((i=1;i<$1;i++))
do
command
done
$#——除脚本名外,命令行上参数的个数。
$? ——上一条前台命令执行后的返回值(也称“退出码”等)。
$$——当前进程的进程号。
$! ——上一个后台命令对应的进程号。
$*——表示在命令行上实际给出的所有实参。
gcc编译系统
三个过程:
preprocessing
gcc -E :分析伪指令,头文件 条件编译:生成.i
compiling :进行语法分析
gcc -S:生成.s的汇编文件
Assembler:将汇编代码翻译为机器代码
gcc -c :生成.o文件
linking
gcc -o :生成.out3文件
rpm
- -i:install
- -u:update
- -v:显示执行过程
- -l:显示文件列表
- -q:询问:一般和a,l连用
- -e:卸载
- -a:显示所有的包
Linux控制台的使用
六个字符控制台
ctrl+alt+f1-f6,是六个字符控制台
Ctrl+alt+f7是图形界面即x+windows
在字符控制台下,Linux使用startx命令进行进入图形界面
linux外在设备的使用
首先我们先来介绍一下分区和挂载的概念
分区是对硬盘进行格式化分区,只有按相应的格式进行分区才能将数据写入磁盘
而挂载呢,就是将逻辑位置的物理位置映射到该分区上,我们说的文件系统类型是什么呢?就是分区的格式,只有确定知道硬盘分区的格式才能写入数据呀。
接下来是设备文件和硬件
Linux中,设备do都是以设备文件的形式存在,那当然,不同的设备类型就有不同得到文件类型了
设备文件的命名方式是主设备号+次设备号,
比如说:
sd:scsi硬盘,sda:scsi硬盘的第一块硬盘,sda1:scsi硬盘的第一块硬盘的第一个分区(u盘被认为是sd类型)
fd是软盘。
常用的文件系统格式
- msdos:dos文件系统
- vfat:当成是windows文件系统
- iso9660:光盘格式的文件系统
- ext2/ext3/ext4:Linux的主流文件系统
- xfs:一种高性能得到日志文件系统
了解这些之后,我们就可以挂载使用了,当挂载好后,我们访问这个挂在目录,就可以访问这个设备文件了
挂载方式
mount -t 文件系统类型 设备名就是设备文件 挂载点
例如 mount -t vfat /dev/sda1 /mnt/usb
设备的下载
unmount 挂载目录
Linux操作系统的内核得到功能有
内存管理
进程管理
进程间通信
虚拟文件系统
Linux支持许多种文件系统,它用通用的文件系统模型表示各种不同的文件系统,屏蔽了具体的文件系统之间的差异
可以分为逻辑文件系统和设备驱动程序
逻辑文件系统就是各种文件系统的格式
设备驱动程序就是每一种设备控制器所编写的设备驱动程序模块
网络接口:提供了对各种网络1标准的实现和各种网络硬件的支持
再讲一下linux初始化init系统
从BIOS开始,加载系统镜像到内存,进行内核初始化,内和初始化结束后创建PID=1的进程,然后需要一个系统去初始化init进程的行为,这个系统就是init系统。
这里要介绍一个系统服务管理工具
systemd,它是一个用户级别的管理工具
# 重启系统
$ sudo systemctl reboot
# 关闭系统,切断电源
$ sudo systemctl poweroff
# CPU停止工作
$ sudo systemctl halt
# 暂停系统
$ sudo systemctl suspend
# 让系统进入冬眠状态
$ sudo systemctl hibernate
# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep
# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue
# 立即启动一个服务
$ sudo systemctl start apache.service
# 立即停止一个服务
$ sudo systemctl stop apache.service
# 重启一个服务
$ sudo systemctl restart apache.service
# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service
# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload
# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service
# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service
# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500
显示操作系统相关参数
root@kali:~# uname
Linux
root@kali:~# uname -a
Linux kali 4.9.0-kali3-amd64 #1 SMP Debian 4.9.16-1kali1 (2017-03-24) x86_64 GNU/Linux
root@kali:~# uname -m
x86_64
root@kali:~# uname -n
kali
root@kali:~# uname -r
4.9.0-kali3-amd64
root@kali:~#
last:显示过去登陆过系统的用户相关信息
读的是/var/log文件
top:相当于windows的任务管理器
split命令:切割文件
telnet 远程连接 Telnet 主机名+端口号
wget:下载软件
stty 用来控制终端的各种设置
比如
root@kali:~# stty -echo
用来关闭自动打印输入字符的功能,一旦关闭,输入的字符就看不到了
这时候就可以在人工输入密码的时候用到了
read pass < /dev/tty
通过这种方式录入密码从终端,当打开tty这个文件时,linux会自动将他定向到终端。
当然最后要将自动打印输入字符的功能打开
stty echo
MAKEFILE
下载源代码包后解压发现一个configur文件,运行它,它是用来检查当前机器的环境的,然后收集环境信息,如果环境检查通过,会生成一个Makefile文件,这个文件是用来编译的,和configur是同一个文件夹下,这个Makefile文件由make开发工具所能识别的,所以,通过make 编译Makefile文件。插入一个点:Makefile文件是一个文本形式的数据库文件,记录了一系列文件之间的依赖关系上所应执行的命令序列,即那希望文件需要先编译,那些文件重新编译,一旦调用这个make命令,他就会自动查找Makefile文件并且去调用它。当确定好依赖关系后,你就可以通过make install 安装这个源文件了。