Linux的基础知识以及相关概念
一、Linux的发行版本
所谓发行版,就是linux内核 + 开源程序
-
debain,ubuntu 其中ubantu是debain的衍生版,桌面系统比较好,适合于初学者入门。
-
slackware, susE
-
redhat,centos,fedora 其中centos,fedora都是redhat的衍生版,fedora主要是测试redhat的新技术。而centos主要是redhat的社区版,免费使用。
-
ArchLinux
-
Gentoo 是针对于技术牛而使用的,安装过程比较复杂。
-
LFS 是Linux From Scratch的简写,从零开始搭建一个简易版的Linux发行版,对于理解Linux编译参数是一个不错的选择。
二、Linux的哲学思想
-
一切皆文件
-
由众多功能单一的小程序组成;每个小程序完成单一的一件事
-
组合小程序来完成复杂的任务
-
尽可能避免人机交互,方便脚本的编写
-
使用文本文件来保存配置信息
-
通过机制,而非策略
三、常见的开源协议
-
GPLv2, GPLv3
-
GPL协议是比较严苛的,只要使用了GPL协议的代码,都必须要开源
-
-
LGPL: Lesser
-
宽松的GPL协议,对于知识应用了库文件,可以不进行开源
-
-
BSD:
-
如果二次发布的产品中包含源代码,则在源代码中必须带有原来的代码中的BSD协议
-
如果二次发布的只是二进制格式的库或程序,则需要在发布的文档或版权声明中说明包含原来的代码中的BSD协议
-
不可以用开源代码的作者/组织和原来的产品名字做市场推广
-
-
Apache License:
-
Apache协议与BSD协议规范一样
-
四、bash的特性
1、命令与路径补全
-
根据内建命令或外部命令的查找方式查找以用户指定的字符串开头的命令
-
以用户指定的起始路径进行文件名补全查找
-
如果用户指定的开头字符串能惟一标识某命令或路径,则tab键可补全此命令或路径。否则,则两次tab键可显示所有以指定字串开头的命令或指定路径下所有文件
2、命令行展开
-
~:展开为用户家目录
-
~USERNAME:展开为指定用户的家目录
-
{}使用多项式乘法展开,例如 /tmp/{a,b}/{c,d}展开为/tmp/a/c,/tmp/a/d,/tmp/b/c,/tmp/b/d。
3、命令别名和命令引用
1)命令别名:
-
别名设置:
alias ALIAS=COMMAND,例如:alias cls='clear'
当别名与命令名同名是:使用绝对路径或\COMMAND的方法是用本来命的含义
命令行修改的别名只对当前会话有效,要想长期保存,需要写到配置文件~/.bashrc中去
-
取消别名:
unalias ALIAS 例如:unalias cls
-a 撤销所有别名
2)命令引用
"":里面支持变量的引用
``:引用一个命令执行结果,等价于$()
1
2
3
4
|
[root@server
alias
]
# mkdir file-`date +%F-%H-%M-%S`
[root@server
alias
]
# mkdir file-$(date +%F-%H-%M-%S)
[root@server
alias
]
# ls
file
-2014-07-03-21-24-10
file
-2014-07-03-21-24-33
|
4、bash特性之文件名通配(globbing):
-
*: 任意长度的任意字符
-
?: 匹配任意单字符
-
[]: 匹配指定范围内的任意单字符
-
[^]:匹配指定范围以外的任意单字符
字符集合:
-
[:space:] : 所有空白字符
-
[:punct:] : 所有标点符号
-
[:lower:] :所有小写字母
-
[:upper:]:所有大写字母
-
[:digit:]:所有数字
-
[:alnum:]:所有字母+数字
-
[:alpha:]:所有字母
练习使用:
1、显示/tmp/test/目录下所有以a开头,以一个小字母结尾,且中间出现一位数字的文件或目录
1
2
|
[root@server
test
]
# ls -d /tmp/test/a*[[:digit:]]*[[:lower:]]
/tmp/test/a22e
/tmp/test/a22r
|
2、显示/tmp/test/目录下,以任意一位数字开头,且以非数字结尾的文件或目录
1
2
|
[root@server
test
]
# ls -d /tmp/test/[[:digit:]]*[^[:digit:]]
/tmp/test/224r
/tmp/test/23ddd
|
3、显示/tmp/test/目录下,以非字母开头,后面跟了一个字母及其它任意长度字符的文件或目录
1
2
|
[root@server
test
]
# ls -d /tmp/test/[^[:alpha:]][[:alpha:]]*
/tmp/test/2s4df
|
5、支持快捷键
ctrl + a回到命令行首部
ctrl + e回到命令行尾部
ctrl + u删除命令行首到光标处的所有内容
ctrl + k删除命令行尾到光标处的所有内容
ctrl + c终止命令执行
ctrl + l只做清屏,如有命令行在编写,则依然存在可以编写
ctrl + z将当前命令转入后台执行
ctrl + r启动命令搜索功能,搜素以前使用过的命令
6、bash环境
bash是一个解释器,可以提供编程环境,解释器解释的步骤:词法分析,语法分析,语义分析。
1)bash的变量:
变量类型 | 变量作用范围 |
定义变量 |
引用变量 |
取消变量 | 变量查看 |
本地变量 | 只对当前shell进程有效;对其他shell和当前shell的子shell无效 | VAR_NAME=VALUE | $VAR_NAME | unset VARNANE |
set |
环境变量 | 对当前shell及其子shell有效,对其他shell无效 | export VAR_NAME=VALUE,此时变量定义并赋值了 或者 export VAR_NAME,此时只是定义了环境变量,没有赋值,变量值为空 |
$VAR_NAME | expotrt printenv env |
|
局部变量 | 是针对于shell脚本内部有效的。通常用于函数中。与C语言中的局部变量作用范围类似 | local VAR_NAME=VALUE | $VAR_NAME | ||
位置变量 | 一般用于参数传递,用在脚本中居多。$1,$2,...分别表示参数的第一个,第二个参数,$0表示命令本身 | $# #:代表数字0,1,2... |
|||
特殊变量 | 记录命令执行的一些状态变量 | $? 记录最进一条命令执行是否成功。成功为0,不成功为非0。 $#:保存一个命令的参数个数 S*: 一个命令所有参数,以一个“”包含 $@:一个命令的所有参数,每个参数以一个“”包含 $!:上一个命令的PID $$:当前进程的PID |
2)变量命名规则:
-
-
不能使用bash程序中的关键字(保留字),所谓系统关键字就是系统已有的变量名,命令等名字
-
只能使用数字、字母、下划线,并且不能一数字开头
-
尽量要做到顾名思义
-
3)变量的类型
1.数值型
精确数值:整数
近似数值:浮点数
单精度浮点
双精度浮点
2.字符型
char,string
3.布尔型
true,false 用来判断逻辑关系的
4)bash的配置文件
配置文件种类 | 适用对象 |
功能 | ||
profile类 | 全局:/etc/profile /etc/profile.d/*.sh |
交互式登陆用户 | 直接通过终端输入账号和密码登陆 | 设定环境变量 运行命令后脚本 |
使用su -l USERNAME | ||||
用户:~/.bash_profile | su - USERNAME登陆 | |||
bashrc类 | 全局:/etc/bashrc | 非交互式登陆用户 | su USERNAME | 设定本地变量 设定命令别名 |
用户:~/.bashrc | 图形界面下打开的终端 | |||
执行脚本 |
补充:bash配置文件读取顺序
交互式登陆的用户:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash.profile --> ~/.bashrc--> /etc/bashrc
非交互登陆用户:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
五、Linux的文件层次(FHS)
Linux文件系统的基础特性:
1、文件名严格区分大小写
2、所有文件都们于根目录下,FHS
3、路径以/做为分隔符
4、每个文件的名称可使用除/以外任意字符,单个名称最长不能超出255个字符;
-
/bin, /sbin: 系统自身启动和运行时可能会用户的核心二进制命令
-
/lib: 共享库文件和内核模块
-
/lib64: 64位系统的共享库文件和内核模块
-
/etc: 配置文件
-
/usr:
-
/usr/bin, /usr/sbin: 系统运行中,用户为完成某些操作可能用到的命令
-
/usr/lib, /usr/lib64: 库文件
-
/usr/share/man, /usr/share/doc:应用程序手册或帮助文档
-
-
/dev: devices的简写,所有设备的设备文件都存放于此处;设备文件通常也称为特殊文件(仅有元数据,而没有数据)
-
/proc: 伪文件系统,内核和进程信息的虚拟文件系统接口,像系统系统后,CPU、内存都抽象为文件放在此目录下
-
/sys: 伪文件系统,硬件设备信息虚拟文件系统接口
-
/boot: 系统引导加载时用到的静态文件,内核和ramdisk(CentOS5:initrd,CentOS6:initramfs), grub(bootloader)
-
/home/USERNAME:指定用户的家目录
-
/root:root用户的家目录
-
/mnt:临时文件挂载的路径
-
/media:便携式设备的挂载路径,像U盘,CD
-
/srv: 服务所用到的数据
-
/tmp: 临时文件存储位置
-
/var: 经常发生变化的文件
-
/var/log:里面存放各个应用程序的日志文件
-
-
/misc: 备用目录
-
/opt: 第三方应用程序的安装目录
-
/usr/local: 现在软件安装的目录
-
-
/selinux Security Enhanced Linux: 安全加强的Linux
六、linux中的单位换算
-
8 bit = 1 Byte
-
1024 B = 1 K
-
1024 K = 1 M
-
1024 M = 1 G
-
1024 G = 1 T
-
1024 T = 1 P
-
1024 P = 1 E
-
1024 E = 1 Z
-
1024 Z = 1 Y
七、自由软件的定义
-
自由使用
-
自由学习和修改
-
自由分发
-
自由创建衍生版
八、重定向
1)重定向就是改变应用程序或命令输入和输出流的位置
文件描述符:fd,内核中唯一标识文件的一个数字
文件类型 | 文件描述符 | 一般设备 |
标准输入 | 0 | 鼠标 |
标准输出 | 1 | 显示器 |
标准错误输出 | 2 | 显示器 |
2)输出重定向
输出重定向:将应用程序标准输出保存到指定的文件中
输出重定向格式 | 功能 |
CMOMMAND > POSITION | 覆盖输出 |
CMOMMAND >> POSITION | 追加输出 |
错误输出重定向:将应用程序标准错误输出保存到指定的文件中
错误输出重定向格式 | 功能 |
CMOMMAND 2> POSITION | 覆盖输出 |
CMOMMAND 2>> POSITION | 追加输出 |
重定向合并:将标准输出和标准错误输出保存到指定相同文件中
重定向合并格式 | 功能 |
CMOMMAND &> POSITION 或者 CMOMMAND > POSITION 2 > &1 | 覆盖输出 |
CMOMMAND &>> POSITION 或者 CMOMMAND >> POSITION 2 > &1 | 追加输出 |
分别重定向:将标准输出和标准错误输出保存到指定不
分别重定向格式 | 功能 |
CMOMMAND > POSITION1 2> POSITION2 | 覆盖输出 |
CMOMMAND >> POSITION1 2>> POSITION2 | 追加输出 |
/dev/null 数据黑洞,可以将数据随时扔到里面,也可以从里面无穷取得数据
可以设定bash的工作特性:
set -C 作用是如果要输出的文件存在,则不能覆盖
1
2
3
4
5
|
[root@server ~]
# set -C ;cat /etc/fstab > /tmp/test/myfstab
-
bash
:
/tmp/test/myfstab
: cannot overwrite existing
file
####此时可以使用以下命令强制覆盖
[root@server ~]
# cat /etc/fstab >| /tmp/test/myfstab
|
set +C:取消上面bash的设置
3)输入重定向
输入重定向:将标准输入以指定的文件代替
CMOMMAND < POSITION1 对于有些程序(命令)无输入流是,可采用输入重定向,比如:tr命令
1
2
3
4
5
6
7
8
9
10
|
[root@server
test
]
# tr 'a-z' 'A-Z' /tmp/test/test
tr
: extra operand `
/tmp/test/test
'
Try `
tr
--help'
for
more
information.
#像这种命令没有标准输入参数,靠重定向输入传递输入数据流
[root@server
test
]
# tr 'a-z' 'A-Z' < /tmp/test/test
THIS IS A TEST FILE!
HOU ARE YOU?
HELLOW WORLD.
123COMMAND1234098
|
<<:追加重定向,一般是与输出重定向一起使用
CMOMMAND > POSITION1 << END(自定义的结束标志)
1
2
3
4
5
6
7
8
9
10
|
[root@server
test
]
# cat << END > /tmp/test/a.out
> hello
> thank you!!
> END
[root@server
test
]
# cat /tmp/test/a.out
hello
thank you!!
#一般是像这样使用的
|
tee命令:实现一输入多输出
COMMAND | tee POSITION
1
2
3
4
5
6
7
8
9
10
11
|
[root@server
test
]
# cat /tmp/test/test | tee /tmp/mytest.test
this is a
test
file
!
hou are you?
HELLOW WORLD.
123command1234098
[root@server
test
]
# cat /tmp/mytest.test
this is a
test
file
!
hou are you?
HELLOW WORLD.
123command1234098
|
未完待续......