Linux基础

Linux基础(Ubuntu)

Ubuntu是一个不错的开源Linux系统,值得学习,所以这里我记录了课件中一些常见指令方法和一些老师所说需要注意的重点,以备以后所需

Begin

Linux多工,多使用者系统
Unix,Linux 和Window一样,有阶层型的目录系统
第一个目录,根目录,可以有文件、目录
Linux只有一个单一的文件系统树
目录有父目录,子目录,目前所在目录叫目前工作目录

terminal 终端机 文字型界面
(sudo)root/superuser的权限
最后字符是#表示目前终端是超级管理员/root权限

更新Ubuntu系统

操作描述
sudo apt-get update更新软件列表
sudo apt-get upgradee更新软件

Shell

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
很多指令允许一起使用

选项options

短选项(- 后跟单个字母)
例如 -a,-l,-t
可合并使用(如ls -Rl)

长选项 (- - 后跟完整单词)
例如 - -all

参数arguments

参数是指指令的作用对象
例如 cp foo.txt bar.txt

Linux 文件系统层次标准

路径描述
/根目录
/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

Commands指令类型
1.可执行程序
2.shell内建指令
3.shell函数
4.alias别名

指令描述
type显示指令的类型,
which表明哪一个可执行程序会被执行
help获得关于shellbuiltins(内建指令)的帮助
man显示指令的参考手册
apropos显示可用指令的清单
info显示指令信息条目
whatis对指令非常简单的描述
alias对指令建立别名

type

type command

which

只有对可执行程序才有用(对内建指令和别名没有用)

help

很多可执行程序都会有- -help选项
简短精确
描述语句中出现中括号[],代表可选项
竖线 | 代表互相排斥的选项

man

man program

在大多数Linux系统中,man 使用less来显示手册页
man显示的使用手册会包含用户指令,系统管理指令,编程接口,文件格式等

man section search_term

section contents
1用户指令
2内核系统调用的编程接口
3.C函数库的编程接口
4.特殊文件(设别节点和驱动程序)
5.文件格式
6.游戏与娱乐(屏保)
7.杂项
8.系统管理指令

apropos

每行输出的第一个字段是手册页的名字,第二个字段是section

tips:
man-k与apropos一样意义

info

GNU Project提供info来替代手册页
信息页面是有超链接的(*___)

操作描述
显示指令帮助
PgUp or Backspace显示前一页
PgDn or Space显示下一页
n显示下个节点
p显示上个节点
u显示当前显示节点的父节点
Enter跟随光标的超链接
q离开

alias

alias name=’string’(等号左右两边不要有空格)
unalias 移除别名
一次shell session结束 alias做过的更动不会存在

tips:
在用 alias前先用type试试有没有被使用

ls

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 文件名浏览文件

less

操作描述
Page UP or b回滚一页
Page Down or space向右滚动一页
Up Arrow向上滚动一行
Down Arrow向下滚动一行
G移动到文件的末尾
1G or g移动到文件的开头
/characters搜索下一个出现的字符
n搜索上一个搜索的下一个出现项
h显示帮助信息
q退出less

Files And Directories

指令描述
cp复制文件和目录
mv移动更名文件和目录
mkdir创建目录
rm移除文件和目录
ln建立硬链接和软连接

wildcards 通配符

字符描述
*匹配0或多个任意字符
匹配一个任意字符(每一个?就是一个字符)
[字符]匹配[]里面任何一个字符
[!字符]匹配非[]内字符
[[:类:]]匹配特定类
[:alnum:]匹配任意文数字
[:alpha:]匹配任意文字
[:digit:]匹配任意数字
[:lower:]匹配任意小写字母
[:upper:]匹配任意大写字母

mkdir

mkdir directory. . .

mkdir dir1
mkdir dir1 dir2 dir3

cp

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

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

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

ln file link 硬链接只能对文件
ln -s item link 软链接可以是文件或目录

Hard links and Symbolic links

Hard links

硬链接是Unix最传统的创建链接的方式
当创建一个硬链接时,会有一个名字指向文件
它引用的是文件在文件系统中的物理索引(也称为 inode)
(任何档案建立的时候都会有一个硬链接)
ls-li 得到完整信息,前面带有inode ,可以来判断是否是同一个东西

硬链接的限制:
不能引用自身文件系统之外的文件,意味着链接不能引用与链接不在同一磁盘分区上的文件
硬链接不能引用目录

特点:
硬链接与文件本身没有区别
它不像软链接,当列出一个包含硬链接的目录,你看不到有什么特别的标记
当删除一个硬链接,文件本身还会继续存在,除非删除的是他最后一个硬链接

Symbolic links

软链接是为克服硬链接的限制而创造的
会创建一种特殊类型的文件,包含指向引用文件或目录的文本指针

特点:
由软链接指向的文件很大程度上是不可区分的
当删除软链接时,只删除链接,不删除文件本身
如果文件先被删除,链接继续存在,但不会指向任何内容
ls指令会用的特殊的颜色(红色)显示断开的链接

tips:
建议用相对路径去建立Symbolic links

Redirection

I/O重新导向

指令描述
cat读取一个或多个文件并复制到标准输出
sort排序
uniq重复部分除去
grep找到符合样式的行
wc计算有多少行,字,字节数
head输出文件最前面的部分
tail输出文件最后面的部分
tee从标准输入读取资料,写入标准输出和文件

cat

读取一个或多个文件并复制到标准输出,可以显示内容

cat[file…]

通常用于显示短文本文件,也可用于合并文件
例如 有movie.mpeg.001…movie.mpeg.100
cat movie.mpeg.0*>movie.mpeg

依照排序顺序进行合并
如果没给cat任何参数,会从标准输入读取输入,即等待键盘输入
在输入后按Ctrl-d表示输入完毕

uniq

通常和sort一起使用
接受一个已经排序后的标准输入或文件,预设值是把重复文件移除,写到标准输出
-d把重复的显示出来

wc

接收标准输入
-l只输出行数

grep

grep pattern[file…]
预设区分大小写
-i不区分大小写
-v不符合匹配的印出来

head/tail

预设最前/最后十行
-n 指定需要的行数

tail

可以实时查看文件
-f只显示最后5行
Ctrl-c停止

tips:
要看syslog需要superuser的权限

tee

显示出中间结果

Standard input,output,and error

1.程序的结果
2.状态与错误

程序将结果发送到叫做标准输出的特殊文件中(standard output,stdout)
并将状态信息发送到另一个叫标准错误的文件中(standard error,stderr)
默认情况下,标准输出和标准错误都直接链接到screen,不保存在磁盘
许多程序从标准输入(standard input,stdin)获取,预设链接键盘

通过I/O重新导向,可以改变output的地方和input的来源

Redirecting Standard Output

>文件名称
输出到文件中
当用>进行重新导向,目标文件会从头开始被覆盖(overwriting)过去,如果发生错误导致指令没有输出,所以会没有内容写入,文件内容会为0
用>>行重新导向,目标文件会从尾部开始加入(append)(如果文件不存在,也会从头开始写,效果会和>一样)

Redirecting Standard Error

要重新导向标准错误,必须用文件描述符(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)接受输入,不做任何操作

Redirecting Standard Input

<B表示从B作为input来源写入standard out里面去

Pipelines

从standard input读取资料,写到standard output

command1|command2
指令1的output和指令2的input连接提来

Expansion

在每次输入指令并按下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/下面所有查询然后用压缩指令压缩

Quoting

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执行历史记录中当前的指令,并自动移到下一个
字符动作
! !执行上一个指令
!数字重复特定数字的指令
!字符重复由该字符串开始的指令(小心使用)
!?字符重复所有包含该字符串字符的指令(小心使用)

Permissions权限

所有者owner
所在组group
其它人world

所有者会属于一个群组

所有者数据在/etc/passwd
所在组数据在/etc/group
密码在/etc/shadow
超级管理员root的uid是0

查看所有用户和用户组:

cat /etc/passwd
cat /etc/group

建立一个所有者,会建立一个群组

指令描述
id用户标识
chmod修改文件模式
umask设置默认文件权限
su以另一个用户身份运行shell
sudo以另一个用户身份执行指令
chown更改文件拥有者
chgrp更改文件所在组设定
passwd更改用户密码

第一个字符表示文件类型

字符描述
-常规文件
d目录文件
l链接文件
c字符设备文件
b块设备文件
p管理文件
s套接字文件
所有者所在组其他人
rwxrwxrwx
属性文件目录
r允许打开读取文件如果是执行属性也允许列出目录内容
w允许写入或截断,但不允许重命名或删除文件(需由目录决定)如果设置了执行权限,则允许创建、删除和重命名目录的文件
x允许将文件视为程序并执行允许作为输入(cd directory)
-无权限无权限

chmod 改变权限

只有文件拥有者或是超级管理员才可以改变

八进制二进制文件模式
0000- - -
1001- -x
2010-w-
3011- wx
4100r- -
5101r-x
6110rw-
7111rwx
字符意义
u所有者
g所在组
o其他人
a所有人
符号意义
u+x为所有者添加执行权限
u-x为所有者移除执行权限
+x为所有者,所在组,其他人添加执行权限
o-rw移除所在组读写权限
go=rw为所在组和其它人设置为具有读写权限,如果已经有执行权限了,会被移除
u+x,go=rx为所有者添加执行权限,并为所在组和其它人设置读取和执行的权限,以,分隔多个语句

tips:
- - recursive 同时作用在文件和目录,用的时候要注意权限设定的问题

umask 设置默认权限

用于控制创建文件时给与的默认权限

默认文件模式rw-rw-rw-
mask0002
mask000 000 000 010
结果- - - rw- rw- r - -

uid、gid、bit

setuid 会按照文件拥有者的身份执行(通常是root) x变s
setgid 实际上group id 会从原来真实id转换为文件拥有者id
通常设置在目录里(用于设置共享) x变s
sticky bit 除非使用者是目录的拥有者或超级管理员,否则不能对目录里文件做删除和更名的操作 x变t

改变执行身份

1.登出登录
2.su以另外个使用者身份来执行
3.sudo管理权限

su

ssu [-l] user 如果带有-l ( -即可),则产生的shell session会是指定用户的登录shell
su -c 'command'只执行一个指令

工作目录会变成用户的家目录
如果没有指定user,则假定为超级管理员
root要有密码才能用su

sudo

更多的控制权限
需要输入的密码是账户的密码,不是root的
不会开一个新的shell,也不会载入其他用户的环境

chown 改变文件拥有者和群组

chown [owner][:[group]] file ...

用法结果
chown ppz file把文件拥有者改成ppz
chown ppz:ppx file把拥有者改成ppz,把群组改成ppx
chown :ppx file把群组改成ppx
chown ppz: file把拥有者改成ppz,群组改成ppz预设的群组

chgrp 改变群组

权限变更

sudo useradd xxx 创建一个名为xxx的用户
sudo passwd xxx 修改xxx的密码
sudo userdel xxx 删除xxx
sudo groupadd aa 创建一个群组aa
sudo chgrp aa /home/ppz 将ppz的群组属性改为aa
sudo groupadd -g 1002 aa 添加一个组名为aa并指定id为1002
sudo usermod aa xxx 为aa组添加一个名为xxx的用户
sudo usermod -a -G bb yyy 为bb添加一个yyy用户(扩展,不覆盖)
sudo useradd yyy -g 1002 -u 1004 -m 添加一个名为yyy到aa组指定id为1004
sudo chmod 755 bb 将bb权限设置为755
sudo gpasswd -A xxx aa 将xxx设为aa的群管理员

长格式解析

-rw-r- -r- - 1 root root 4096 2月 4 12:22 wdz.txt

第一个字符表示文件类型
接下来三个字符是文件所有者的访问权限
接下来三个字符是文件组成员的访问权限
最后三个字符是其他用户的访问权限

链接数(对于文件)
第一层子目录数(对于目录)

用户名(第一个root )
文件所有着的组名(第二个root )

文件大小(单位字节)(4096)

最后修改时间(2月 4 12:22)

文件名(wdz.txt)

Processes进程

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

反馈正在执行的进程的状态
ps -x 把所拥有的进程都显示出来,不管是否有终端控制(如果有?表示这个进程没有连到任何控制终端)
aus 显示每一个使用者的进程

没有横线代表
BSD style
tips:
ps 显示出来的东西会很长,可以配合 | less 减少结果

top

查看系统中各个进程资源占用情况
持续更新,预设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 文件前备份一下

Prompt

\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 Styledpkgapt-get,aptitude
Fedora,CentOS,Red Hat Enterprise Linuxrpmyum

低阶工具还支持建立打包文件
用低阶工具安装一个已经下载好的软件包(没有解决依赖)

系列命令
Debiandpkg - - install package_file
Red Hatrpm -i package_file

用高阶工具来搜索储存在库里的软件包

系列命令
Debianapt-get update apt-cache search search_string
Red Hatyum search search_string

高阶工具允许从一个存储库下载包,并且所有需要被安装的会一起被安装进来(完全依赖)

系列命令
Debianapt-get update apt-get install package_name
Red Hatyum install package_name

移除一个软件包(高阶工具)

系列命令
Debianapt-get remove package_name
Red Hatyum erase package_name

更新软件包(高阶工具)

系列命令
Debianapt-get update; apt-get upgrade
Red Hatyum update

用更新的版本来替换安装

系列命令
Debiandpkg - - install package_file
Red Hatrpm -U package_file

列出所有已经安装的软件包

系列命令
Debiandpkg - - list
Red Hatrpm -qa

知道是否已经安装指定的软件包

系列命令
Debiandpkg - - status package_name
Red Hatrpm -q package_name

显示关于安装的软件包的相关信息

系列命令
Debianapt-cache show package_name
Red Hatyum info package_name

查找是哪个软件包安装的文件

系列命令
Debiandpkg - - search file_name
Red Hatrpm -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

会自动列出将被安装的设备

字段内容描述
1Device设备名称
2Mount Point挂载点(如果内存不足会挂载到虚拟内存swap)
3File System Type文件系统格式( Fourth Extended File System(ext4),FAT16(msdos),FAT32(vfat),NTFS(ntfs),CD-ROM(iso9660),etc)
4Options选项
5Frequency单一数字,指定一个文件是否存在以及何时存在,是否会被系统使用dump进行备份 0代表不会
6Order单一数字,指定文件顺序,用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 匹配文件或目录 内容刚好是 n
24 小时前修改的
-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

expr1operatorexpr2
True-and执行
False-and不执行
True-or不执行
False-or执行
动作描述
-delete移除选择文件
-ls等同于执行ls -dils
-print印出来
-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服务器为例

Formatting Output :格式化输出

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 '{}'  ';' \
	\) \

Html

cat test.html

<html>
     <head>
        <title>homepage</title>
      </head>
      <body>something</body>
   </html>

用浏览器测试

vim ~/bin/test_page

 #!/bin/bash 每个脚本都要有这行
    
# It's script

echo " <html>"
echo " <head>"
echo "<title>homepage</title>"
echo " </head>"
echo "<body>something</body>"
echo "</html>"
chmod 755 ~/bin/test_page
~/bin/test_page
result
    <html>
         <head>
            <title>homepage</title>
          </head>
          <body>something</body>
       </html>

将标准输出写入html

~/bin/test_page > test_page.html
firefox  test_page.html   //再用浏览器测试


    cat   test_page
    #!/bin/bash 每个脚本都要有这行
        
    # It's script
    
    title="Apple"
  echo " 
  <html>
        <head>
                <title>$title</title>
        </head>
                <body>$title</body>
  </html>"

变量名可以是字母数字和下划线
变量名第一个字符必须是字母或下划线,不可用用空格或标点
变量的值通常用大写字母代表常数

变量赋值时等号左右不要有空格

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_
 <html>
            <head>
                    <title>$title</title>
            </head>
            <body>$title</body>
 </html>"
_OO_

//token所在这行只可以有token,连多余空格都不可以有

<<- 会忽略整段文本中的tab字符

脚本设计

脚本函数

function name{
commands
return
}

name(){
commands
return
}

shell函数要在呼叫前定义

流控制

IF

if commands;then
commands
[elif commands;then commands...]
[else 
commands]
fi

命令执行最后会return一个值给系统(0-255) 0成功,其他失败
执行玩指令后 echo $? 得到回传值

内建两个命令(true 和false)
true的回传值是0 ,false的回传值是1
如果 if 后面接不止一个命令,以最后一个命令回传值为主

Test

test 后面参数代表执行
[  参数,最后参数一定要是 ]

text expression
[ expression ]

file expression 表

< > 对于bash有特殊意义,所以要用[ ]或是 \ 转义

string expression 表
int expression 表

[ [ expression ] ] 

键盘

While/Until循环

故障排除

语法错误

常见的错误如缺少 “ ; ‘

:syntax on   //语法高亮
逻辑错误

1.不正确的条件表达式
2.单字节溢出
3.不可预见的情况

测试

一些影响大的先用echo试试看
注释部分代码或是添加一些echo语句帮助测试

#!/bin/bash -x 添加跟踪

set跟踪一段代码的执行情况

set -x 开启
set +x关闭
set -o是查看 (xtrace)

case
case word in
[pattern [| pattern] ...) commands;;]...
esac

匹配(…)

位置参数

转移

$@

输出文件
交互模式
help

(未完待续…)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值