Ubuntu是一个不错的开源Linux系统,值得学习,所以这里我记录了课件中一些常见指令方法和一些老师所说需要注意的重点,以备以后所需
Linux多工,多使用者系统
Unix,Linux 和Window一样,有阶层型的目录系统
第一个目录,根目录,可以有文件、目录
Linux只有一个单一的文件系统树
目录有父目录,子目录,目前所在目录叫目前工作目录
terminal 终端机 文字型界面
(sudo)root/superuser的权限
最后字符是#表示目前终端是超级管理员/root权限
操作 | 描述 |
---|---|
sudo apt-get update | 更新软件列表 |
sudo apt-get upgradee | 更新软件 |
Bash(Bourne-Again Shell)是大多数Linux系统以及Mac OS X默认的shell
从键盘接收指令,把指令交给操作系统去处理
Terminal Emulators 终端仿真器
图形化应用界面通过终端仿真器来与shell交互
指令 | 描述 |
---|---|
data | 显示时间 |
cal | 月历 |
df | 磁盘空间 |
free | 内存空间 |
exit | 离开终端 |
指令 | 描述 |
---|---|
pwd | 印出目前工作目录 |
第一次登录系统时,目前工作目录是家目录
指令 | 描述 |
---|---|
ls | 显示目前工作目录下的内容 |
cd | 改变目录(后边跟路径) |
绝对路径 从根目录开始
cd /user/bin
相对路径 由目前工作目录开始
字符 | 描述 |
---|---|
.(dot) | 代表工作目录 |
. . (dot dot) | 代表工作目录的父目录 |
/ | 工作目录的子目录 |
操作 | 描述 |
---|---|
cd | 回到家目录 |
cd – | 回到前一个工作目录 |
cd ~user_name | 到user的家目录去 |
文件开头是 .(period characer)开头的,是隐藏文件(可用用ls -a查看)
Linux,Unix文件名有分大小写,Windows,Macos没有分大小写
linux没有副档名的概念
文件名支持很长的名字,包括空格和标点符号
不过通常用句点,破折号和下划线
大部分指令用法:
command -options arguments
很多指令允许一起使用
短选项(- 后跟单个字母)
例如 -a,-l,-t
可合并使用(如ls -Rl)
长选项 (- - 后跟完整单词)
例如 - -all
参数是指指令的作用对象
例如 cp foo.txt bar.txt
路径 | 描述 |
---|---|
/ | 根目录 |
/bin | 包含系统启动和运行时必须存在的二进制文件(程序) |
/boot | 包括linux 核心,初始RAM磁盘映像(用于引导时所需的驱动程序)和引导加载程序 |
/boot/grub/grub.conf menu.lst | 用于配置引导加载程序 |
/boot/vmlinuz linux | 核心 |
/dev | 包含设备节点的特殊目录 |
/etc | 所有系统组态档,脚本 |
/etc/crontab | 自动化执行的 |
/etc/fstab | 储存设备及相关挂载点 |
/etc/passwd | 用户账户列表 |
/home | 主目录 |
/lib | 包含核心系统程序使用的共享库文件 |
/lost+found | 使用linux文件系统每个格式化分区或设备都使用这个目录,用于从文件系统损坏事件中进行部分恢复的情况 |
/media | 包含在插入时自动挂在的可移动媒体 |
/mnt | 在旧的Linux系统上,/mnt目录包括手动安装的可移动式设备的挂载点 |
/opt | 目录用于安装可选的软件 |
/proc | 由Linux 核心维修的虚拟文件系统 |
/root | 根目录 |
/sbin | 系统的二进制文件,为超级管理员保留重要的系统目录 |
/tmp | 储存各种程序创建的临时、不稳定的文件(每次重新启动系统会清空该目录) |
/usr | 目录树可能是Linux系统上最大的目录树(包含普通用户使用的所有程序和支持文件) |
/usr/bin | 包含Linux发行版安装的可执行程序 |
/usr/lib | 程序的共用库 |
/usr/local | 不包括在发行版但用于系统的程序 |
/usr/sbin | 包含更多的系统管理程序 |
/usr/share | 包含/usr/bin中程序使用的所有共享数据,这包含默认配置文件、图标、屏幕背景、声音文件 |
/usr/share/doc | 按package来组织文件 |
/var | 存储可能更改的数据 |
/var/log | 包含日志文件,各种系统活动的记录(必须是超级用户才能查看日志文件) |
Commands指令类型
1.可执行程序
2.shell内建指令
3.shell函数
4.alias别名
指令 | 描述 |
---|---|
type | 显示指令的类型, |
which | 表明哪一个可执行程序会被执行 |
help | 获得关于shellbuiltins(内建指令)的帮助 |
man | 显示指令的参考手册 |
apropos | 显示可用指令的清单 |
info | 显示指令信息条目 |
whatis | 对指令非常简单的描述 |
alias | 对指令建立别名 |
type command
只有对可执行程序才有用(对内建指令和别名没有用)
很多可执行程序都会有- -help选项
简短精确
描述语句中出现中括号[],代表可选项
竖线 | 代表互相排斥的选项
man program
在大多数Linux系统中,man 使用less来显示手册页
man显示的使用手册会包含用户指令,系统管理指令,编程接口,文件格式等
man section search_term
section contents
1用户指令
2内核系统调用的编程接口
3.C函数库的编程接口
4.特殊文件(设别节点和驱动程序)
5.文件格式
6.游戏与娱乐(屏保)
7.杂项
8.系统管理指令
每行输出的第一个字段是手册页的名字,第二个字段是section
tips:
man-k与apropos一样意义
GNU Project提供info来替代手册页
信息页面是有超链接的(*___)
操作 | 描述 |
---|---|
? | 显示指令帮助 |
PgUp or Backspace | 显示前一页 |
PgDn or Space | 显示下一页 |
n | 显示下个节点 |
p | 显示上个节点 |
u | 显示当前显示节点的父节点 |
Enter | 跟随光标的超链接 |
q | 离开 |
alias name=’string’(等号左右两边不要有空格)
unalias 移除别名
一次shell session结束 alias做过的更动不会存在
tips:
在用 alias前先用type试试有没有被使用
ls后可跟目录名称
ls -l 输出长格式(更详细资讯)
选项 | 描述 |
---|---|
-l | 以长格式显示结果 |
-S | 按文件大小排序 |
-t | 按修改时间排序 |
-R | 将目录下所有的子目录的文件都列出来(递归) |
-a,- -all | 把目录里所有文件列出来(包括隐藏) |
-A,- -almost -all | 把目录里所有文件列出来(当前目录和父目录不会显示) |
-d,- -directory | 查看目录的详细信息而不是目录的内容 |
-F,- -classify | 在文件名称后面追加一个提示符,如果是目录,加个/ |
-h,- -human-readable | 长格式中,以人类可读的格式显示文件大小,而不是字节 |
-r,- -reverse | 以相反的顺序显示结果 |
tips:
ls指令实际上是别名
操作 | 描述 |
---|---|
file 文件名 | 辨识文件类型 |
less 文件名 | 浏览文件 |
操作 | 描述 |
---|---|
Page UP or b | 回滚一页 |
Page Down or space | 向右滚动一页 |
Up Arrow | 向上滚动一行 |
Down Arrow | 向下滚动一行 |
G | 移动到文件的末尾 |
1G or g | 移动到文件的开头 |
/characters | 搜索下一个出现的字符 |
n | 搜索上一个搜索的下一个出现项 |
h | 显示帮助信息 |
q | 退出less |
指令 | 描述 |
---|---|
cp | 复制文件和目录 |
mv | 移动更名文件和目录 |
mkdir | 创建目录 |
rm | 移除文件和目录 |
ln | 建立硬链接和软连接 |
字符 | 描述 |
---|---|
* | 匹配0或多个任意字符 |
? | 匹配一个任意字符(每一个?就是一个字符) |
[字符] | 匹配[]里面任何一个字符 |
[!字符] | 匹配非[]内字符 |
[[:类:]] | 匹配特定类 |
[:alnum:] | 匹配任意文数字 |
[:alpha:] | 匹配任意文字 |
[:digit:] | 匹配任意数字 |
[:lower:] | 匹配任意小写字母 |
[:upper:] | 匹配任意大写字母 |
mkdir directory. . .
mkdir dir1
mkdir dir1 dir2 dir3
cp item1 item2
cp item… directory
cp file1 file2 (如果file2存在,则用file1覆盖,如果file2不存在,直接创建一个file2)
cp file1 dir1 (dir1必须存在)
cp dir1 dir2 (如果dir2不存在,则会创建一个dir2,再复制)
选项 | 描述 |
---|---|
-a,- -archive | 复制文件和目录及其所有属性,包括所有权和权限(通常复制品拥有执行复制的用户的默认属性) |
-i,- -iteractive | 在覆盖目标文件之前给出提示,提示用户确认是否覆盖,回答"y"时目标文件将被覆盖,如果没用-i,默认覆盖 |
-r,- -recursive | 递归复制该目录下所有的子目录和文件 |
-u,- -update | 当复制文件从一个目录到另一个目录,之后目标目录中不存在或是比已存在更新的才会复制过去(适合复制大量文件) |
-v,- -verbose | 执行复制的时候显示信息 |
mv item1 item2
mv item… directory
mv file1 file2(如果file2存在,file2会被盖掉,如果不存在,则会创建一个file2,无论如何,file1将消失)
mv file1 dir1 (dir1必须存在)
mv dir1 dir2(如果dir2已经存在,将dir1全部搬到dir2里,如果dir2不存在,则会创建一个dir2,再将dir1内容搬到dir2,删除dir1)
tips:
mv后原来文件一定会消失
选项 | 描述 |
---|---|
-i,- -interactive | 覆盖目标文件之前给出提示,提示用户确认是否覆盖,回答"y"时目标文件将被覆盖,如果没用-i,默认覆盖 |
-u,- -update | 当移动文件从一个目录到另一个目录,之后目标目录中不存在或是比已存在更新的才会复制过去(适合复制大量文件) |
-v,- -verbose | 执行移动的时候显示信息 |
rm item…
rm file1 删除file1
rm file1 dir1删除file1和dir1
选项 | 描述 |
---|---|
-i,- -interactive | 删除目标文件之前给出提示,提示用户确认是否覆盖,回答"y"时目标文件将被删除,如果没用-i,默认删除 |
-r,- -recursive | 递归删除目录,如果有子目录,也要删除 |
-f,- -force | 忽略不存在的对象,这个会覆盖- -interactive选项 |
-v,- -verbose | 执行删除的时候显示信息 |
tips:
类似Unix的系统是没有undelete指令的
要用rm删东西前先用ls和适配符试一下
删除受保护的文件需要superuser
ln file link 硬链接只能对文件
ln -s item link 软链接可以是文件或目录
硬链接是Unix最传统的创建链接的方式
当创建一个硬链接时,会有一个名字指向文件
它引用的是文件在文件系统中的物理索引(也称为 inode)
(任何档案建立的时候都会有一个硬链接)
ls-li 得到完整信息,前面带有inode ,可以来判断是否是同一个东西
硬链接的限制:
不能引用自身文件系统之外的文件,意味着链接不能引用与链接不在同一磁盘分区上的文件
硬链接不能引用目录
特点:
硬链接与文件本身没有区别
它不像软链接,当列出一个包含硬链接的目录,你看不到有什么特别的标记
当删除一个硬链接,文件本身还会继续存在,除非删除的是他最后一个硬链接
软链接是为克服硬链接的限制而创造的
会创建一种特殊类型的文件,包含指向引用文件或目录的文本指针
特点:
由软链接指向的文件很大程度上是不可区分的
当删除软链接时,只删除链接,不删除文件本身
如果文件先被删除,链接继续存在,但不会指向任何内容
ls指令会用的特殊的颜色(红色)显示断开的链接
tips:
建议用相对路径去建立Symbolic links
I/O重新导向
指令 | 描述 |
---|---|
cat | 读取一个或多个文件并复制到标准输出 |
sort | 排序 |
uniq | 重复部分除去 |
grep | 找到符合样式的行 |
wc | 计算有多少行,字,字节数 |
head | 输出文件最前面的部分 |
tail | 输出文件最后面的部分 |
tee | 从标准输入读取资料,写入标准输出和文件 |
读取一个或多个文件并复制到标准输出,可以显示内容
cat[file…]
通常用于显示短文本文件,也可用于合并文件
例如 有movie.mpeg.001…movie.mpeg.100
cat movie.mpeg.0*>movie.mpeg
依照排序顺序进行合并
如果没给cat任何参数,会从标准输入读取输入,即等待键盘输入
在输入后按Ctrl-d表示输入完毕
通常和sort一起使用
接受一个已经排序后的标准输入或文件,预设值是把重复文件移除,写到标准输出
-d把重复的显示出来
接收标准输入
-l只输出行数
grep pattern[file…]
预设区分大小写
-i不区分大小写
-v不符合匹配的印出来
预设最前/最后十行
-n 指定需要的行数
可以实时查看文件
-f只显示最后5行
按Ctrl-c停止
tips:
要看syslog需要superuser的权限
显示出中间结果
1.程序的结果
2.状态与错误
程序将结果发送到叫做标准输出的特殊文件中(standard output,stdout)
并将状态信息发送到另一个叫标准错误的文件中(standard error,stderr)
默认情况下,标准输出和标准错误都直接链接到screen,不保存在磁盘
许多程序从标准输入(standard input,stdin)获取,预设链接键盘
通过I/O重新导向,可以改变output的地方和input的来源
>文件名称
输出到文件中
当用>进行重新导向,目标文件会从头开始被覆盖(overwriting)过去,如果发生错误导致指令没有输出,所以会没有内容写入,文件内容会为0
用>>行重新导向,目标文件会从尾部开始加入(append)(如果文件不存在,也会从头开始写,效果会和>一样)
要重新导向标准错误,必须用文件描述符(file descriptor)
standard input是0
standard output是1
standard error是2
例如
ls-l /bin/usr>ls.output.txt 2>&1 把standard error 覆写到standard output
当standard output和standard error要写入同一个文件内,可以用&>
附加用 &>>
当不需要指令输出,直接丢掉时,将输出重新导向至/dev/null(bit bucket)接受输入,不做任何操作
Pipelines
从standard input读取资料,写到standard output
command1|command2
指令1的output和指令2的input连接提来
在每次输入指令并按下Enter时,shell会在执行指令前对文本执行一些进程
shell会自动做扩张的动作
echo 显示一行文本
echo * (*会做路径名扩张)
cd 把目前使用者目录印出来
cd ~ word (把使用者word的目录印出来)
$((表达式))
只支持整数
运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 余数 |
* * | 求幂 |
大括号扩展可以包含前文(preamble)部分和后文(preamble)部分
表达式本身可以包含一个逗号分隔的字符串列表,也可以包含整数的范围或单个字符
例如:
echo Front-{A,B,C}-Back
echo No_{1…5}
echo {001…15}
echo a{A{1,2},B{3,4}}b
each $USER 印出当前用户
printenv|less 印出环境变量
ls -l $(which cp)
file $(ls -d /usr/bin/*|grep zip) 对/usr/bin/下面所有查询然后用压缩指令压缩
shell会把多余的空白空间去除(word-splitting)
通过引用来防止Shell限制shell的扩展动作(转义)
" $ ", " \ ", " ` " 仍然会扩张
双引号( “…” )
禁止分词、路径、波浪线、大括号扩展,但参数,算数,和命令扩展依然存在
单引号( ‘…’ )
完全禁止扩展
反斜线()
转义
在echo用添加-e可以解释转义
指令 | 描述 |
---|---|
clean | 清除屏幕 |
history | 显示历史清单 |
按键 | 动作 |
---|---|
Ctrl-a | 移动到行首 |
Ctrl-e | 移动到行尾 |
Ctrl-f | 移动到前一个字符 |
Ctrl-b | 移动到后一个字符 |
Alt-f | 向前移动一个单词 |
Alt-b | 向前移动一个单词 |
Ctrl-l | 清除屏幕并移动到左上角(和clear指令操作相同) |
按键 | 动作 |
---|---|
Ctrl-d | 删除光标处的字符 |
Ctrl-t | 将光标处的字符和前一个字符交换位置 |
Alt-t | 将光标出的单词和前一个单词交换位置 |
Alt-l | 从光标处到单词末位转为小写 |
Alt-u | 从光标处到单词末位转为大写 |
按键 | 动作 |
---|---|
Ctrl-k | 删除光标处的字符 |
Ctrl-u | 将光标处的字符和前一个字符交换位置 |
Alt-d | 将光标出的单词和前一个单词交换位置 |
Alt-Backspace | 从光标处到单词末位转为小写 |
Ctrl-y | 从光标处到单词末位转为大写 |
Shell有一个完成的机制
按tab可以自动做完成的动作(如果可以的话)
可以完成路径名,变量(开头是$),用户名(开头是~),主机名(开头是@且要在/etc/hosts目录下有)
按键 | 动作 |
---|---|
Alt-? | 显示可能匹配的列表(按两次Tab也可以) |
Alt-* | 所有可能的都列出来 |
History | lsee查看历史指令列表
通常储存最后的500个或1000个
可用grep去搜索特定的历史指令
结果最前面的数字是该指令在历史记录里的编号,可用!数字直接执行该指令
按键 | 动作 |
---|---|
Ctrl-r | 启动增量搜索 |
Enter | 执行找到的指令 |
Ctrl-j | 将这一行复制到当前命令行 |
Ctrl-g or Ctrl-c | 停止搜索 |
Ctrl-p | 移到上一个 |
Ctrl-n | 移到下一个 |
Alt-< | 移到列表开头 |
Alt-> | 移到列表结尾 |
Ctrl-r | 反向增量搜索(越打越多) |
Alt-p | 反向搜索(非递增),在执行搜索前要按enter |
Alt-n | 向前搜索(非递增) |
Ctrl-o | 执行历史记录中当前的指令,并自动移到下一个 |
字符 | 动作 |
---|---|
! ! | 执行上一个指令 |
!数字 | 重复特定数字的指令 |
!字符 | 重复由该字符串开始的指令(小心使用) |
!?字符 | 重复所有包含该字符串字符的指令(小心使用) |
所有者owner
所在组group
其它人world
所有者会属于一个群组
所有者数据在/etc/passwd
所在组数据在/etc/group
密码在/etc/shadow
超级管理员root的uid是0
建立一个所有者,会建立一个群组
指令 | 描述 |
---|---|
id | 用户标识 |
chmod | 修改文件模式 |
umask | 设置默认文件权限 |
su | 以另一个用户身份运行shell |
sudo | 以另一个用户身份执行指令 |
chown | 更改文件拥有者 |
chgrp | 更改文件所在组设定 |
passwd | 更改用户密码 |
第一个字符表示文件类型
字符 | 描述 |
---|---|
- | 常规文件 |
d | 目录文件 |
l | 链接文件 |
c | 字符设备文件 |
b | 块设备文件 |
p | 管理文件 |
s | 套接字文件 |
所有者 | 所在组 | 其他人 |
---|---|---|
rwx | rwx | rwx |
属性 | 文件 | 目录 |
---|---|---|
r | 允许打开读取文件 | 如果是执行属性也允许列出目录内容 |
w | 允许写入或截断,但不允许重命名或删除文件(需由目录决定) | 如果设置了执行权限,则允许创建、删除和重命名目录的文件 |
x | 允许将文件视为程序并执行 | 允许作为输入(cd directory) |
- | 无权限 | 无权限 |
只有文件拥有者或是超级管理员才可以改变
八进制 | 二进制 | 文件模式 |
---|---|---|
0 | 000 | - - - |
1 | 001 | - -x |
2 | 010 | -w- |
3 | 011 | - wx |
4 | 100 | r- - |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
字符 | 意义 |
---|---|
u | 所有者 |
g | 所在组 |
o | 其他人 |
a | 所有人 |
useradd xxx //创建一个名为xxx的用户
符号 | 意义 |
---|---|
u+x | 为所有者添加执行权限 |
u-x | 为所有者移除执行权限 |
+x | 为所有者,所在组,其他人添加执行权限 |
o-rw | 移除所在组读写权限 |
go=rw | 为所在组和其它人设置为具有读写权限,如果已经有执行权限了,会被移除 |
u+x,go=rx | 为所有者添加执行权限,并为所在组和其它人设置读取和执行的权限,以,分隔多个语句 |
tips:
- - recursive 同时作用在文件和目录,用的时候要注意权限设定的问题
用于控制创建文件时给与的默认权限
默认文件模式 | rw-rw-rw- |
---|---|
mask | 0002 |
mask | 000 000 000 010 |
结果 | - - - rw- rw- r - - |
setuid 会按照文件拥有者的身份执行(通常是root) x变s
setgid 实际上group id 会从原来真实id转换为文件拥有者id
通常设置在目录里(用于设置共享) x变s
sticky bit 除非使用者是目录的拥有者或超级管理员,否则不能对目录里文件做删除和更名的操作 x变t
1.登出登录
2.su以另外个使用者身份来执行
3.sudo管理权限
ssu [-l] user
如果带有-l ( -即可),则产生的shell session会是指定用户的登录shell
su -c 'command'
只执行一个指令
工作目录会变成用户的家目录
如果没有指定user,则假定为超级管理员
root要有密码才能用su
更多的控制权限
需要输入的密码是账户的密码,不是root的
不会开一个新的shell,也不会载入其他用户的环境
chown [owner][:[group]] file ...
用法 | 结果 |
---|---|
chown ppz file | 把文件拥有者改成ppz |
chown ppz:ppx file | 把拥有者改成ppz,把群组改成ppx |
chown :ppx file | 把群组改成ppx |
chown ppz: file | 把拥有者改成ppz,群组改成ppz预设的群组 |
-rw-r- -r- - 1 root root 4096 2月 4 12:22 wdz.txt
第一个字符表示文件类型
接下来三个字符是文件所有者的访问权限
接下来三个字符是文件组成员的访问权限
最后三个字符是其他用户的访问权限
链接数(对于文件)
第一层子目录数(对于目录)
用户名(第一个root )
文件所有着的组名(第二个root )
文件大小(单位字节)(4096)
最后修改时间(2月 4 12:22)
文件名(wdz.txt)
Linux的多工,多进程的系统
init 内核启动的用户级进程,执行shell scripts,启动系统服务
daemon 守护进程()
父进程
子进程
init 通常pid 为1
进程会有拥有者id,有效用户id
内容 意义
PID 进程编号
TTY 控制终端
Time 所用CPU的时间
STAT 进程状态
USER 使用者ID
%CPU CPU使用率
%MEM 内存使用率
VSZ 虚拟内存大小
RSS 物理内存大小
START 进程开始时间
STAT 进程状态
状态 意义
R 正在运行/准备好执行的进程
S 休眠的进程
D 不可被唤醒的休眠的进程
T 停止的进程
Z 僵尸进程(被终止,但父进程还没有对其进行清除)
< 高优先级进程
N 低优先级进程
反馈正在执行的进程的状态
ps -x 把所拥有的进程都显示出来,不管是否有终端控制(如果有?表示这个进程没有连到任何控制终端)
aus 显示每一个使用者的进程
没有横线代表
BSD style
tips:
ps 显示出来的东西会很长,可以配合 | less 减少结果
查看系统中各个进程资源占用情况
持续更新,预设3秒更新
显示分两部分,整体系统状况摘要 和 进程表
显示的参数:
1.进程名
当前时间
执行时间
使用者数
平均被等待执行的进程,前60秒情况,前5分钟情况,前15分钟情况
2.Tasks 进程数和各种过程状态
3.CPU(s)CPU正在执行活动的特征
us CPU执行使用者进程比率
sy CPU执行系统进程比率
ni CPU低优先级进程比率
id CPU空闲比率
wa CPU等待I/O的比率
4.Mem: 被使用的物理内存
5.Swap: 被用的虚拟内存
jobs 把目前运行的工作显示出来
bg 把进程放后台运行
bg %(job号)
fg 把进程放前台运行
bg %(job号)
默认前台,通过& 切换为后台执行
Ctrl-c 中断进程
Ctrl-z 终止前台进程
kill 传递信号给进程
kill [-signal] pid
编号 名称 意义
1 HUP 挂断(后台的会重启)
2 INT 中断(Ctrl-c)
3 QUIT 退出
9 KILL 核心直接杀掉进程(粗暴)(信号直接给核心)
11 SEGV 非法使用内存
15 TERM 终止
18 CONT 让停止继续
19 STOP 停止(信号直接给核心)
20 TSTP 终端停止(程序可以忽略它)
28 WINCH 窗口改变
tips:
可以加 SIG
e,g SIGINT
killall 对符合条件的进程传同样的讯号
shutdown 关闭或重启电脑
pstree以树状模式排列,显示进程间的父子关系
vmstat 输出系统资源使用的快照(用Ctrl-c终止)
xload 绘制一个图形
tload 在终端中绘制图形(用Ctrl-c终止)
环境变量和shell变量(由bash放入的数据)
printenv 印出部分或全部环境(只会显示环境变量) 默认全部
set 设定shell选项(会显示环境变量和shell变量) 默认全部,有排序
export 让后序程序能看到环境设定
alias 为指令设定别名
常用变量
DISPLAY 显示
EDITOR 文字编辑器
SHELL Shell名
HOME 家目录
LANG 语言
OLD_PWD 之前的工作目录
PAGER 按页显示
PATH 命令的路径
PS1 改变命令提示符
PWD 目前工作目录
TERM 终端
TZ 时区
USER 使用者名称
启动bash时,会读适用于所有使用者的启动档,然后会在每个使用者的家目录寻找启动档
(etc下共用的和家目录下)
login shell 有做登录动作
non-login 没做登录动作
login shell 所寻找启动文件的目录
/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
non-login 所寻找启动文件的目录
/etc/bash.bashrc
~/.bashrc
也会从父进程继承一些环境下来
图像化编辑器和文本编辑器
图像化编辑器:
GNOME gedit(Text Editor)
KDE kedit,kwrite,kate
文本编辑器:
nano(取代了pico)
vi(取代了vim)
emacs
source .bashrc 强制去读,使修改生效
tips:
建议操作profile,bashrc 文件前备份一下
\a 噔
\d 把目前年月日显示
\h 不包含@后的一长串
\H 完整主机名
\j 多少个job正在执行
\l 目前终端名字
\n 换行
\r 回车
\s shell名字
\t 用24小时制
\T 12小时制
@ 12小时制带AM/PM
\A 目前时间(24小时)
\u 当前用户名
\v shell的版本号
\V shell的版本发布号
\w 目前工作目录
\W 目前工作目录最后部分
! 目前指令的编号
# 在shell session输入多少指令
$ 如果是超级管理员
\[ 现在开始一个不打印字元
\] 不打印字元的结束
操作 | 描述 |
---|---|
echo $PS1 | 查看默认提示符设置 |
export PS1=”” | 引号内为需要设置的参数 |
export PS1改变后一旦重启又会恢复成系统默认样式,要彻底改变它的样式,只能从配置文件中改。
在PS1中设置字符序列颜色的格式为:\e[F;Bm字符
其中“F”为字体颜色,编号30 ~37;“B”为背景色,编号40~47
具体参数见Linux终端颜色代码
例:
export PS1=”\e[01;32mppz\e[m:\e[01;34m\w\e[m$ ”
所有非打印字符都必须用"\[\]"(不包括引号)将其包围起来,否则系统在计算提示符长度时也会将其计算在内,会导致输入时换行异常
修改如下:
[\e[01;32m]字符[\e[m][\e[01;34m]字符[\e[m]$
显示结果:
ppz:-$ (ppz字体高亮显示 绿色:\w目前工作目录 (-)字体高亮显示 蓝色 $后边还有个空格)
不同的封装系统有不同的套件管理规则,互不兼容
主要分为以下两大系列
Debian Style(.deb) Debian,Ubuntu,Linux Mint,Raspbian
Red Hat Style(.rpm)Fedora,CentOS,Red Hat Enterprise Linux,OpenSUSE
Linux所有软件都可以从网上找到
打包文件是封装系统最基本的单位,把所有需要的文件压缩起来,还可能有元数据,文本描述,安装脚本
创建一个打包文件的人被称为 程序包维护者(Package maintainer)
如今大多数的包是有发行方和相关的第三方所创建
一个系统可能有不同阶段的不同的版本库,例如测试库,开发库
有些第三方库会违反法律,所以有些人把服务器设在别的国家,让人们可以去下载
写程序的时候很少完全独立,往往会依赖很多的组件,在安装程序的时候也需要把相依赖的共享函数库也安装
组件管理系统可以根据相依性解析确保在安装时把所有相关的库都安装好
####低阶与高阶封装工具
low-level tool
high-level tool
系列 | 低阶工具 | 高阶工具 |
---|---|---|
Debian Style | dpkg | apt-get,aptitude |
Fedora,CentOS,Red Hat Enterprise Linux | rpm | yum |
低阶工具还支持建立打包文件
用低阶工具安装一个已经下载好的软件包(没有解决依赖)
系列 | 命令 |
---|---|
Debian | dpkg - - install package_file |
Red Hat | rpm -i package_file |
用高阶工具来搜索储存在库里的软件包
系列 | 命令 |
---|---|
Debian | apt-get update apt-cache search search_string |
Red Hat | yum search search_string |
高阶工具允许从一个存储库下载包,并且所有需要被安装的会一起被安装进来(完全依赖)
系列 | 命令 |
---|---|
Debian | apt-get update apt-get install package_name |
Red Hat | yum install package_name |
移除一个软件包(高阶工具)
系列 | 命令 |
---|---|
Debian | apt-get remove package_name |
Red Hat | yum erase package_name |
更新软件包(高阶工具)
系列 | 命令 |
---|---|
Debian | apt-get update; apt-get upgrade |
Red Hat | yum update |
用更新的版本来替换安装
系列 | 命令 |
---|---|
Debian | dpkg - - install package_file |
Red Hat | rpm -U package_file |
列出所有已经安装的软件包
系列 | 命令 |
---|---|
Debian | dpkg - - list |
Red Hat | rpm -qa |
知道是否已经安装指定的软件包
系列 | 命令 |
---|---|
Debian | dpkg - - status package_name |
Red Hat | rpm -q package_name |
显示关于安装的软件包的相关信息
系列 | 命令 |
---|---|
Debian | apt-cache show package_name |
Red Hat | yum info package_name |
查找是哪个软件包安装的文件
系列 | 命令 |
---|---|
Debian | dpkg - - search file_name |
Red Hat | rpm -qf file_name |
USB
CD-RW 光碟
软盘
指令 | 描述 |
---|---|
mount | 挂载文件系统 |
umount | 卸载文件系统 |
fsck | 检查和修复文件系统 |
fdisk | 分区表操作 |
mkfs | 创建文件系统 |
fdformat | 格式化软盘 |
dd | 将面向块的数据写入装置 |
genisoimage (mkisofs) | 创建一个ISO 9660映像文件 |
wodim (cdrecord) | write数据到光存储介质 |
md5sum | 计算MD5校验 |
现在我们所使用的一般linux设备管理方面很方便,自动帮我们处理,在服务器的linux,可能还需要人工操作
管理存储装置的第一步是将设备连接到文件系统树
/ etc / fstab
会自动列出将被安装的设备
字段 | 内容 | 描述 |
---|---|---|
1 | Device | 设备名称 |
2 | Mount Point | 挂载点(如果内存不足会挂载到虚拟内存swap) |
3 | File System Type | 文件系统格式( Fourth Extended File System(ext4),FAT16(msdos),FAT32(vfat),NTFS(ntfs),CD-ROM(iso9660),etc) |
4 | Options | 选项 |
5 | Frequency | 单一数字,指定一个文件是否存在以及何时存在,是否会被系统使用dump进行备份 0代表不会 |
6 | Order | 单一数字,指定文件顺序,用fsck检查文件系统 1最优先 0不会检查 |
格式:device on mount_point type file_system_type(options)
挂载完成后才能读取
umount
卸载
mkdir /ect/guazaidian
建立一个空的目录,用于挂载
mount -t filesystem
挂载
只要设备在被使用,是不可以卸载的(如果更改了工作目录到挂载点会导致繁忙,用cd离开当前目录,解除占用)
匹配 | 设备 |
---|---|
/dev/fd* | 软盘 |
/dev/hd* | IDE(PATA) 硬盘( /dev/hda master /dev/hdb slave /dev/hdc master /dev/hdc slave) |
/dev/lp* | 印表机 |
/dev/sd* | SCSI硬盘 |
/dev/sr* | 光碟 |
sudo tail -f /var/log/syslog
插入移动设备
list usbhost
桌面版的ubuntu会自动挂载
sudo mkdir /mt/f
sudo mount dev/sdb1 /mt/f
df #检查linux文件系统的磁盘空间情况
1.创建新的分区布局(重新分区) (fdisk)
sudo fdisk -l #找到待分区的磁盘
sudo umount /dev/sdb1
sudo fdisk /dev/sdb1
Command(m for help): p #检查目前分区布局
Command(m for help): L #显示可以转换类型的清单
Command(m for help): t #更改分区的系统id (例如可改为83 Linux)
Command(m for help): w #所有更改都在内存里,只有用w写入设备
Command(m for help): Q #觉得不更改,用Q退出
2.在驱动器上创建一个新的空的文件系统 (mkfs)
sudo mkfs -t ext4 /dev/sdb1 #以ext4作为系统类型
sudo mkfs -t vfat /dev/sdb1 #以FAT32作为系统类型
fsck除了检查文件系统完整性,还可以修复文件系统(取决于损毁程度)
检查usb(要先卸载)
sudo fsck /dev
sudo fdformat /dev/fd0 #不一定是fd0
sudo mkfs -t msdos /dev/fd0 #msdos微软磁盘操作系统
dd将数据块从一个地方移动到另一个地方
dd if=input_file of=output_file [bs=block_size [count=blocks]]
#例如
dd if=/dev/sdb of=/dev/sdc #从sdb复制到sdc
dd if=/dev/cdrom of=ununto.iso #从一个Ubunto CD复制一个iso文件 **音频CD不可以**
创建包含目录内容的iso镜像文件
genisoimage -o cd-rom.iso -R -J ~/cd-rom-files
#- - R允许使用长文件名和POSIX风格的文件权限
#- -j 允许用于Windows的长文件名
mkdir /mnt/iso_image #创建挂载点
mount -t iso9660 -o loop image.iso /mnt/iso_image #直接安装iso映像文件
wodim dev=/dev/cdrw blank=fast #重写CD 快速模式
wodim dev=/dev/cdrw image.iso 写入图像
md5sum image.iso 验证完整性
locate 通过名字寻找文件
find 在目录层次中寻找文件
xargs 从标准输入构建和执行命令行( 接受来自标准输入作为输入,交给下个指令执行)
touch 改变文件时间
stat 显示文件或文件系统状态
locate 通过名字寻找文件
对资料库搜寻,速度快
locate zip | grep bin
其他变种(slocate mlocate)
find
find ~ //所有home目录里的文件
find ~ | wc -l 找出有多少笔
会做测试,符合的才列出来
find ~ type d | wc -l //只有目录才列出来
-name 按照名字
-size 按照文件大小 +超过 -小于 没有符号是刚好
+1M //大于1M
b 512 字节块
c 字节
2 字节的字
k 千字节
M 兆字节
G 千兆字节
Test 描述
-cmin n 匹配文件或目录 内容或属性 刚好是 n 分钟前修改的
-cbewer file 匹配文件或目录 内容或属性 比 file 更新的
-ctime n 匹配文件或目录 内容或属性 刚好是 n24 小时前修改的
-empty 匹配空的文件或目录
-group name 匹配group 名字匹配文件或目录
-iname pattern 匹配符合样式的名字(不区分大小写)
-inum n 匹配有n个索引节点的的文件(hardlink)
-mmin n 匹配文件或目录 内容刚好是n分钟前修改的
-mtime n 匹配文件或目录 内容刚好是 n24 小时前修改的
-name pattern 匹配符合样式的名字
-newer file 匹配文件或目录 内容 比 file 更新的
-nouser 匹配没有使用者的文件或目录(不是合法的文件)
-nogroup 匹配没有有效组的文件或目录
-perm mode 匹配权限
-samefile name 匹配同一个文件
-size n 大小
-type c 形态
-user name 拥有者
操作 描述
-and 与(-a)
-or 或(-o)
-not 否(!)
( ) 优先执行(使用时要用 \ 转义)
(expression 1) -or (expression 2)
find ~ \( -type f -not -perms 0600 \) -or \( -type d -not -perms 0700 \)
expr1 -operator expr2
expr1 | operator | expr2 |
---|---|---|
True | -and | 执行 |
False | -and | 不执行 |
True | -or | 不执行 |
False | -or | 执行 |
动作 | 描述 |
---|---|
-delete | 移除选择文件 |
-ls | 等同于执行ls -dils |
印出来 | |
-quit | 找到一个匹配的就跳出来 |
-ok | 增加询问 |
find ~ -print -and -type f -and -name '*.BAK' //第一个为真才会做第二个,第二个为真才会做第三个
-exec *command*{ }; //{}是目前的路径
-exec rm '{}' ';' //表示该行指令结束
-exec rm '{}' + //+ 会做累积,一次呼叫
选项 描述
-depth 优先处理目录里的文件,再处理目录
-maxdepth levels 至多多少层
-mindepth levels 至少多少层
-mount 查找安装在别的文件系统上的目录
-noleaf 查找目录有多少子目录数(Linux Unix可用)
压缩(把重复的部分去除) gzip bzip2
无损(lossless)和有损(lossy)
大多数无损压缩
JPEG,MP3有损
gzip(后缀.gz,Linux使用最多)
gzip file //压缩(不保留原文件)
gunzip file //解压缩
zcat file 解压缩后查看内容
选项 描述
-c 输入写到标准输出,保留原文件
-d 解压缩
-f 强制压缩,即使已经存在
-h 帮助
-l 压缩文件的资讯列出来
-r 如果有目录会递回压缩
-t 测试压缩文件是否有损毁
-v 显示详细资料
-number(1最快,最低压缩度,9最慢,最高压缩度)
bzip2(后缀.bz2,Linux使用其次)
压缩时间比较长,压缩度比较高
bzip2 file //压缩(不保留原文件)
bunzip2 file //解压缩
归档 tar zip
归档是把许多文件收拾到一起打包成一个大文件的过程,往往是做系统备份的一部分
tar(后缀.tar 或 .tgz(压缩后))
tar *mode*[options] *pathname*..
模式 描述
c 建立一个归档
x 解开一个归档
r 把东西加入归档中
t 把归档的内容列出来zu
tar xf *archive.tar* *pathname* //只有panthname被解开
tips GNU 的tar 支持 - - wildcards
find 经常与tar一起使用
find a -name 'B' -exec tar rf a.tar '{}' '+' //把a目录下的名字是B的文件附加到a.tar下面
tar 可以处理 标准输入/标准输出
find apple -name 'filea' | tar cf - -- files-from=- | gzip >apple.tgz
/*第二个-标准输出
files-from : tar 的目标 第二个-标准输入
最后 把得到的用gzip压缩 */
-z tar后做gzip的压缩
-j tar后做bzip2的压缩
find apple -name 'filea' | tar czf apple.tgz -T- //-T- = files-from
tar 结合ssh远程使用(有加密的传输,安全)
mkdir test
cd test
ssh test 'tat cf -Documents' | tar xf - //文件从 - 标准输入得到
ls
result:Documents
zip(可压缩,归档,通常windows使用较多)
zip options zipfile file…
unzip b/apple.zip
zip -r apple.zip apple
创建zip档时,当文件为空的时候,可能没有被压缩
zip 压缩如果指定的现有档案,它将被更新,而不是取代
可以通过将其指定要列出的内容并从zip档案选择性地提取
从标准输入读取文件清单 用-@
find a -name 'filea' | zip -@ filea.zip
unzip 不接受标准输入作为数据来源,但可以写入到标准输出
unzip -p ls-app.zip | less
文件同步
rsync
rsync remote-update protocol
rsync options source destination
/* source destination:
本地文件或目录
远程文件或目录
远程同步服务器*/
rsync -av apple foo
//-a递归处理 -v详细信息
如果修改一个文件,再用rsync同步,仅复制更新的文件
如果在来源处有一些文件不存在,但在本身有,用–delete去去掉本身多余的
可以通过创建别名,添加到.bashrc配置文件里来快捷的使用备份(外接的硬盘)
alias backup=‘sudo rsync -av --delete /etc/home/usr/local/media/BigDisk/backup’
网络上的同步
1.与另一个安装rsync的系统,通过类似于ssh的方式
sudo rsync -av --delete --rsh=ssh /etc/home/usr/local apple/backup
2通过使用rysnc服务器同步
Red Hat Software /Fedora
mkdir banana
rsync -av --delete rsync://rsync.gitlab.gatech.edu/fedora-linux-core/development/i386/os fedora-devel //这里以gatech的rsync服务器为例
nl 每一行的文字加上行号
可以接受多个文件作为参数,也可以接受标准输入
逻辑页
把所有文件当成单一文件流
标记 意义
::: 逻辑页header的开始
:: 逻辑页body的开始
: 逻辑页footer的开始
选项 意义
-b style | 设定body部分数字的格式a所有行都有编号,t所有非空白行都有编号,n没有编号,p regexp 只有符合 regexp才要加编号
-f style 设定footer部分数字的格式,预设是n
-h style 设定header部分数字的格式,预设是n
-i number|设定页码增量,预设1
-n format | 在编号时的格式ln向左对齐,前面不会加0, rn向右对齐,前面不会加0,预设值 rz向右对齐,前面加0=
-p 在每一个逻辑页不用重设数字
-s string 在每一个行号后面添加一个字串来创造分隔符,预设是一个单一的tab
-v number 每一页的第一行设定行号,预设为1
-w width 设定行号宽度,预设为6
每个标记必须单独出现在自己的行里面
fold 限制每行的宽度
fmt 简单的文件格式化
pr 准备印出资料
printf 格式化印出资料
groff 文件格式化系统
包含很多指令的文本档,shell读取文件,执行命令
shell 命令列界面,解译脚本语言
1.写一个脚本
需要一个文本编译器
最好有提供语法高亮
(vim,gedit,kate)
正式开始
#!
(Shebang这个符号告诉应该用哪个解释器来解释这个脚本)
cat hello_world
#!/bin/bash 每个脚本都要有这行
# It's script
echo 'Hello World'
2.让脚本变为可执行的
为脚本设置755使所有人都可以执行,或者是700,仅拥有者可执行
read权限必须要有
3.把脚本放在可执行的地方
可以用相对路径./
放在~/bin 个人使用
/usr/local/bin 系统上每个人都允许使用
/usr/local/sbin 供系统管理员使用
/lusr/ocal 本地软件
在脚本里使用长选项
ls -ad
ls - -all - -directory
在脚本里通过换行缩进把结构显示出来,用tab不会有问题
find a\
\( \
-type f \
-not -perm 0600 \
-exec chmod 0600 '{}' ';' \
\) \
cat test.html
homepage
something
用浏览器测试
vim ~/bin/test_page
#!/bin/bash 每个脚本都要有这行
# It's script
echo " "
echo " "
echo "homepage "
echo " "
echo "something"
echo ""
chmod 755 ~/bin/test_page
~/bin/test_page
result
homepage
something
将标准输出写入html
~/bin/test_page > test_page.html
firefox test_page.html //再用浏览器测试
cat test_page
#!/bin/bash 每个脚本都要有这行
# It's script
title="Apple"
echo "
$title
$title
"
变量名可以是字母数字和下划线
变量名第一个字符必须是字母或下划线,不可用用空格或标点
变量的值通常用大写字母代表常数
变量赋值时等号左右不要有空格
a=z
b="an apple"
c="he is $b"
d=$(ls -l test.html)
e=$((5 * 7))
f="\t a pllel \n"
{}可以帮助shell区分变量
mv $fname ${fname}1
将文本嵌入到脚本里
command << token
text
token
cat << _OO_
$title
$title
"
_OO_
//token所在这行只可以有token,连多余空格都不可以有
<<- 会忽略整段文本中的tab字符
脚本函数
function name{
commands
return
}
name(){
commands
return
}
shell函数要在呼叫前定义
if commands;then
commands
[elif commands;then commands...]
[else
commands]
fi
命令执行最后会return一个值给系统(0-255) 0成功,其他失败
执行玩指令后 echo $?
得到回传值
内建两个命令(true 和false)
true的回传值是0 ,false的回传值是1
如果 if 后面接不止一个命令,以最后一个命令回传值为主
test 后面参数代表执行
[ 参数,最后参数一定要是 ]
text expression
[ expression ]
file expression 表
< > 对于bash有特殊意义,所以要用[ ]或是 \ 转义
string expression 表
int expression 表
[ [ expression ] ]
常见的错误如缺少 “ ; ‘
:syntax on //语法高亮
1.不正确的条件表达式
2.单字节溢出
3.不可预见的情况
一些影响大的先用echo
试试看
注释部分代码或是添加一些echo语句帮助测试
#!/bin/bash -x 添加跟踪
set跟踪一段代码的执行情况
set -x 开启
set +x关闭
set -o是查看 (xtrace)
case word in
[pattern [| pattern] ...) commands;;]...
esac
匹配(…)
转移
$@
输出文件
交互模式
help
(未完待续…)