导图社区 Linux详解
Linux详解详细记录Linux的各方面基础知识,包括基本提示符、常见环境变量、常见信号、常见问题处理等内容。
编辑于2021-11-19 16:54:33Linux基础
常见问题处理
常见信号
HUP
脚本与所在的终端脱离联系。
INT
用户按下 Ctrl + C,意图让脚本中止运行。
QUIT
用户按下 Ctrl + 斜杠,意图退出脚本。
KILL
该信号用于杀死进程。
TERM
这是kill命令发出的默认信号
EXIT
这不是系统信号,而是 Bash 脚本特有的信号,不管什么情况,只要退出脚本就会产生。
SIGINT
中断,即按 Ctrl + C 所产生的信号
常见环境变量
PS1
https://www.bookstack.cn/read/bash-tutorial/docs-prompt.md
命令提示符配置项
PS2
PS3
PS4
基本提示符
\d :代表日期,格式为weekday month date,例如:Wed Dec 12
\H :完整的主机名称。例如:hostname是debian.linux
\h :仅取主机的第一个名字,如上例,则为debian,.linux则被省略
\t :显示时间为24小时格式,如:HH:MM:SS
\T :显示时间为12小时格式
\A :显示时间为24小时格式:HH:MM
\u :当前用户的账号名称 如:root
\v :BASH的版本信息 如:3.2
\w :完整的工作目录名称。家目录会以 ~代替 如显示/etc/default/
\W :利用basename取得工作目录名称,只会列出最后一个目录。如上例则只显示default
\# :下达的第几个命令
\$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$
其他
端口占用
SSH
ssh-keygen
参数
-t
指定加密类型(如:rea,dsa)
-C
指定注释,用于识别这个密钥
命名空间
进程命名空间
隔离进程ID
网络命名空间
隔离网络设备、协议栈、端口等
IPC命名空间
用户命名空间
隔离用户和group ID
UTS命名空间
挂载命名空间
shell
函数
参数
传参
长短参数
同一个配置项往往有长和短两种形式,比如-l是短形式,--list是长形式,它们的作用完全相同。短形式便于手动输入,长形式一般用在脚本之中,可读性更好,利于解释自身的含义。
取值
方式
$1~$n
获取参数的值。$文件名或方法名,$1表示第一个参数,$2表示第二个参数,大于9需要用{}
shift
详见 常见命令
实例
配合case实现参数定义
getopts
$0
Shell本身的文件名
$#
传递到脚本或函数的参数个数,不含脚本名
$*
以一个单字符串显示所有向脚本传递的参数
$@
与$*相同,但是使用时加引号,并在引号中返回每个参数。
$$
脚本运行的当前进程ID号
$!
后台运行的最后一个进程的ID号
$-
显示Shell使用的当前选项,与set命令功能相同。
$?
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
返回
return
return的作用是退出函数
exit
exit是退出脚本文件
概要
return语句会返回一个退出值(即返回值)给调用函数的当前程序,而exit会返回一个退出值(即返回值)给执行程序的当前Shell
状态码
状态码取值范围为0-255
0
命令成功结束
1
通用未知错误
2
误用shell命令
126
命令不可执行
127
没找到命令
128
无效退出参数
128+x
Linux信号x的严重错误
130
命令通过Ctrl+C终止
255
退出状态码越界
外部函数引用
需要使用source或“.”来加载
注意事项
默认情况下,函数的退出状态码就是函数最后一条命令的返回的退出状态码,用 $? 查看
变量
类型
只读变量
#!/bin/bash myUrl="https://www.google.com" readonly myUrl myUrl="https://www.runoob.com" 运行脚本,结果如下: /bin/sh: NAME: This variable is read only.
全局变量
只在当前 Shell 进程中有效,对其它 Shell 进程和子进程都无效
实例我
在函数内部定义的普通变量,默认作用于全局,函数外部可以访问
在shell最外部定义的变量
局部变量
定义方法:local value
只能在函数内部使用
实例
函数内部定义的变量,且有local标识
环境变量
可以在当前 Shell 进程中使用
可以在子进程中使用
环境变量还可以传递给孙进程
通过export导出的变量
操作
删除变量
#!/bin/sh myUrl="https://www.runoob.com" unset myUrl echo $myUrl
变量取值
${value:-word}
当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.
${value:=word}
与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将word赋值给value
${value:?message}
若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若此替换出现在Shell程序中,那么该程序将终止运行)
${value:+word}
若变量以赋值的话,其值才用word替换,否则不进行任何替换
${value:offset}
${value:offset:length}
从变量中提取子串,这里offset和length可以是算术表达式.
${#value}
变量的字符个数 (变量的字符个数,并不是变量个数)
${value#pattern}
${value##pattern}
去掉value中与pattern相匹配的部分%2c条件是value的开头与pattern相匹配
#与##的区别在于一个是最短匹配模式,一个是最长匹配模式.
${value%pattern}
${value%%pattern}
与上类似,只是是从value的尾部于pattern相匹配,%与%%的区别与#与##一样
${value/pattern/string}
${value//pattern/string}
进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的区别与上同
export
export [-fnp][变量名称]=[变量设置值]
-f
代表[变量名称]中为函数名称
-n
删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中
列出所有的shell赋予程序的环境变量
-p
作用
使系统在创建每一个新的shell时,定义这个变量的一个拷贝
注意只作用于子Shell
执行脚本命令
source(.)
使用source或者“.”来调用外部脚本,不会产生新的进程,继承当前shell环境变量,而且被调用的脚本运行结束后,它拥有的环境变量和声明变量会被当前shell保留,类似将调用脚本的内容复制过来直接执行。执行完毕后原主shell继续运行。
脚本不需要执行权限
./
打开一个“新的子shell”去读取、执行脚本
脚本需要执行权限
sh
通过创建子进程(subshell)去执行脚本,父进程无法使用子进程中的变量,而子进程对环境变量的修改也不会影响到父进程。父进程中的局部变量子进程也无法使用,子进程会继承父进程的环境变量;
脚本不需要执行权限
bash
打开一个subshell去读取、执行a.sh,而a.sh不需要有"执行权限"
fork
使用fork执行脚本的时候会创建一个子进程去执行该脚本,子进程会继承父进程的环境变量和声明变量。当子进程执行完毕后会返回父进程,但是父进程的环境变量不会因子进程的改变而改变。
exec
被执行的脚本会继承当前shell的环境变量,exec相当于创建了新进程,它会将主进程的进程资源占用,使用主进程的pid,而exec语句执行完之后,后续的语句不再执行;
脚本需要执行权限
条件判断
字符串
str1 = str2
当两个串有相同内容、长度时为真
str1 != str2
当串str1和str2不等时为真
-n str1
当串的长度大于0时为真(串非空)
-z str1
当串的长度为0时为真(空串)
str1
当串str1为非空时为真
shell有个特性,当字符串作为判断依据时,非空为真,空为假,如空字符串也是假
str1>str2
str1是否大于str2
str1<str2
str1是否小于str2
数字
int1 -eq int2
两数相等为真
int1 -ne int2
两数不等为真
int1 -gt int2
int1大于int2为真
int1 -ge int2
int1大于等于int2为真
int1 -lt int2
int1小于int2为真
int1 -le int2
int1小于等于int2为真
备注
greater than
大于
less than
小于
equals
等于
文件
-r file
是否存在并用户可读为真
-w file
是否存在并用户可写为真
-x file
是否存在并用户可执行为真
-f file
是否存在并文件为正规文件为真
-d file
是否存在并文件为目录为真
-c file
是否存在并文件为字符特殊文件为真
-b file
是否存在并文件为块特殊文件为真
-s file
是否存在并文件大小非0时为真
-t file
是否存在并当文件描述符(默认为1)指定的设备为终端时为真
-O file(大写o)
是否存在并属当前用户所有
-G file
是否存在并默认组与当前用户相同
-e
文件存在为真
-L
是否存在并软链接为真
-S
是否存在并套节字为真
-ef( [ “file1” -ef “file2” ] )
是否存在并两文件为同一个文件为真
-nt ( [ “file1” -nt"file2" ] )
是否存在并文件1比文件2创建的晚为真
-ot ( [ “file1” -ot “file2” ] )
是否存在并文件1比文件2创建的早为真
复杂逻辑判断
-a
与
-o
或
!
非
&&
用来执行条件成立后执行的命令
||
用来执行条件不成立后的执行命令
概要
实例
[ "$a" -lt "$b" -a "$b" -lt "$c" ]
前后两个判断同时满足为true
test 或 [ ]
目标
数值比较
字符串比较
文件比较
注意
只能使用简单的算数操作,如大于小于等于
(( ))
目标
数学表达式
注意
可进行高级数学运算,如加减乘除
[[ ]]
目标
模式匹配
实例
if [[ $USER = r* ]]
模式表达式不需要双引号
注意
高级字符串处理
逻辑控制
if
if...fi
if [ expression ] then Statement(s) to be executed if expression is true fi
if...else...fi
if [ expression ] then Statement(s) to be executed if expression is true else Statement(s) to be executed if expression is not true fi
if...elif...fi
if [ expression 1 ] then Statement(s) to be executed if expression 1 is true elif [ expression 2 ] then Statement(s) to be executed if expression 2 is true elif [ expression 3 ] then Statement(s) to be executed if expression 3 is true else Statement(s) to be executed if no expression is true fi
for
for var in word1 word2 ... wordN do Statement(s) to be executed for every word. done
until
until command do Statement(s) to be executed until command is true done
case
case...esac
case word in pattern1) Statement(s) to be executed if pattern1 matches ;; pattern2) Statement(s) to be executed if pattern2 matches ;; pattern3) Statement(s) to be executed if pattern3 matches ;; esac
while
while command do Statement(s) to be executed if command is true done
与或非
select
select var in word1 word2 ... wordN do Statement(s) to be executed for every word. done
break
continue
异常处理
方法
command || exit 1
只要command有非零返回值,脚本就会停止执行
command || { echo "command failed"; exit 1; }
if ! command; then echo "command failed"; exit 1; fi
command if [ "$?" -ne 0 ]; then echo "command failed"; exit 1; fi
command1 && command2
第一个命令成功了才执行第二个
set -e
#!/usr/bin/env bash set -e foo echo bar
脚步执行过程中,只要出现错误就立即终止执行
command || true
com命令执行失败也不会退出
排错
默认命令异常继续执行
#! /bin/bash dir_name=/path/not/exist cd $dir_name rm * 如果目录$dir_name不存在,cd $dir_name命令就会执行失败。这时,就不会改变当前目录,脚本会继续执行下去,导致rm *命令删光当前目录的文件。 解决办法: cd $dir_name && rm * (但还是存在风险,dir_name为空会进入用户主目录,删除所有) [[ -d $dir_name ]] && cd $dir_name && rm *
cd $dir_name && rm *
dir_name为空会进入用户主目录,删除所有
数组
注意
shell仅支持一维数组
语法
array_name=(value1 value2 ... valuen)
array_name[0]=value0 array_name[1]=value1 array_name[2]=value2
${array_name[index]}
取值
@ 或 * 可以获取数组中的所有元素
${my_array[*]}
${my_array[@]}
获取数组长度
${#my_array[*]}
${#my_array[@]}
字符串
获取长度
string="abcd" echo ${#string} #输出 4
提取子字符串
string="runoob is a great site" echo ${string:1:4} # 输出 unoo
查找子字符串
string="runoob is a great site" echo `expr index "$string" io` # 输出 4
模式匹配删除
${variable%pattern}
这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式
${variable%%pattern}
这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
${variable#pattern}
这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式
${variable##pattern}
这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
模式匹配提取/替换
${var:num}
这种模式时,shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。
${var:num1:num2}
num1是位置,num2是长度。表示从$var字符串的第$num1个位置开始提取长度为$num2的子串。不能为负数。
${var/pattern/pattern}
表示将var字符串的第一个匹配的pattern替换为另一个pattern。
${var//pattern/pattern}
表示将var字符串中的所有能匹配的pattern替换为另一个pattern。
符号
单引号
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号
双引号里可以有变量
双引号里可以出现转义字符
分号
分号(;)是命令的结束符,使得一行可以放置多个命令,上一个命令执行结束后,再执行第二个命令。 注意,使用分号时,第二个命令总是接着第一个命令执行,不管第一个命令执行成功或失败。 如:$ clear; ls
&
加到命令或脚本后,表示该命令或脚本在后台运行
&&
||
|管道
所谓管道命令,就是多个子命令通过管道运算符(|)组合成为一个大的命令。Bash 会把最后一个子命令的返回值,作为整个命令的返回值。也就是说,只要最后一个子命令不失败,管道命令总是会执行成功,因此它后面命令依然会执行
把前面命令的结果给后面的命令
$( ) 或 ` `
区别
` ` 基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高,但反单引号容易打错或看错。
$( )并不是所有shell都支持。
命令替换
实例
$((expression)) 和`exprexpression`效果相同%2c 计算数学表达式exp的数值%2c 其中exp只要符合C语言的运算规则即可%2c 甚至三目运算符和逻辑表达式都可以计算。
version=$(uname -r)和version=`uname -r`都可以是version得到内核的版本号
$[ ] 或 $(( ))
$[]和$(())是一样的,都是进行数学运算的。支持+ - * / %(“加、减、乘、除、取模”)。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。
$[1+1]将可变长字符转换成整型的(可变长字符:节省系统资源)
实例
a=5; b=7; c=2; echo $(( a+b*c )); 19 echo $(( (a*b)%c)) 1 $(( $a + $b * $c)) 19
echo $((16#2a)) 结果为 42 (16进位转十进制)
$ 或 ${ }
一般情况下,$var 与${var} 并没有什么不一样,但是用 ${ } 会比较精确的界定变量名称的范围
变量替换
模式匹配
# 是去掉左边(在键盘上#在$之左边)
% 是去掉右边(在键盘上%在$之右边)
#和%中的单一符号是最小匹配,两个相同符号是最大匹配。
{ }
作用
https://blog.csdn.net/HappyRocking/article/details/90609554?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
字符扩展
{}可以作为通配符进行扩展,有两种用法: echo {a,b}.txt 输出a.txt b.txt。与echo [a-b].txt区别在于,后者只输出存在的文件名,而前者不管是不是存在此文件,永远都会输出a.txt b.txt,因为{}的字符扩展和是不是文件名没有关系。 echo {a..c}.txt输出a.txt b.txt c.txt。
代码块
又被称为内部组,格式为{ cmd1;cmd2;},这个结构事实上创建了一个匿名函数 。 {}与()都可以执行一连串命令,区别如下: ()会新开一个子进程,括号内命令与括号外无关。{}内的命令不会新开一个子进程运行,即脚本余下部分仍可使用括号内变量。 两者括号内的命令间都要用;隔开,但()最后一个命令的分号可有可无,但{}最后一个也必须有分号。 {}的第一个命令和左括号{之间必须要有一个空格(右括号}无此要求),而()两个括号的空格均可有可无。
特殊替换结构
有4种特殊的替换结构:${var:-string},${var:+string},${var:=string},${var:?string} (1)${var:-string}表示若变量var不为空,则等于var的值,否则等于string的值。 比如: a='' b="bbb" echo ${a:-foo} # 输出:foo echo ${a:-"foo"} # 输出:foo echo ${a:-$b} # 输出:bbb 1 2 3 4 5 (2)${var:=string}的替换规则与${var:-string}相同,不过多了一步操作:若var为空时,还会把string的值赋给var。 比如: a='' b="bbb" echo ${a:=$b} # 输出:bbb echo $a # 输出:bbb 1 2 3 4 (3)${var:+string}的替换规则和上面的相反,表示若变量var不为空,则等于string的值,否则等于var的值(即空值)。 比如: a="" b="bbb" echo ${a:+"foo"} # 输出为空 echo ${b:+"foo"} # 输出:foo 1 2 3 4 (4)${var:?string}表示若变量var不为空,则等于var的值,否则把string输出到标准错误中,并从脚本中退出。 我们可利用此特性来检查是否设置了变量的值,比如一个脚本test.sh内容如下: #!/bin/bash a="" b="bbb" echo ${a:?"warn:string is null"} echo ${b:?"warn:string is null"} echo "done" 1 2 3 4 5 6 然后在命令行中执行命令: $ sh test.sh > out.log 2> err.log # 标准输出至out.log,标准错误输出至err.log $ cat out.log aaa $ cat err.log test.sh: line 5: b: warn:string is null 1 2 3 4 5 可以看到,out.log中没有done,因此脚本执行到Line 5的错误就提前退出了
模式匹配截断
有4种模式:${var%pattern},${var%%pattern},${var#pattern},${var##pattern} (1)${var%pattern}表示看var是否以模式pattern结尾,如果是,就把var中的内容去掉右边最短的匹配模式。 (2)${var%%pattern}表示看var是否以模式pattern结尾,如果是,就把var中的内容去掉右边最长的匹配模式。 (3)${var#pattern}表示看var是否以模式pattern开始,如果是,就把var中的内容去掉左边最短的匹配模式。 (4)${var##pattern}表示看var是否以模式pattern开始,如果是,就把var中的内容去掉左边最长的匹配模式。 比如: a="apple" echo ${a%"le"} # 去掉右边固定"le",输出:app echo ${a%p*} # 去掉右边最短匹配,输出:ap echo ${a%%p*} # 去掉右边最长匹配,输出:a echo ${a#*p} # 去掉左边最短匹配,输出:ple echo ${a##*p} # 去掉左边最长匹配,输出:le
长度截断
有2种模式:${var:num},${var:num1:num2} (1)${var:num}表示提取var中第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。 (2)${var:num1:num2}表示从var中第num1个位置开始提取长度为num2的子串。num1从0开始。 比如: a="apple" echo ${a:2} # 去掉前2个,输出:ple echo ${a: -2} # 保留后2个,输出:le echo ${a:1:3} # 保留从1开始的3个字符,输出:ppl
注意事项
{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
[ ]
作用
条件判断
[] 本质上是 test 语句,[是调用test的命令标识,]是关闭条件判断 a="abc" if [ -n "$a" ]; then echo "true"; fi # 输出true,注意[]内-n或者-z时字符串两边必须加上双引号 if test -n "$a"; then echo "true"; fi # 输出true,注意test内-n或者-z时字符串两边必须加上双引号
字符范围
用作正则表达式的一部分,描述一个匹配的字符范围,如删除一个字符串中的所有数字 echo "ap1p23le" | tr -d "[0-9]" # 输出 apple echo [a-b].txt # 输出:a.txt b.txt,前提是两个文件都存在。 # 但是如果当前路径只存在a.txt或b.txt,则只会输出存在的文件。 # 如果两个文件均不存在,则输出固定字符串:[a-b].txt
数组下标
在一个array后,作为引用数组元素的下标 a=(1 2 3) echo ${a[0]} # 输出:1 echo ${a[*]} # 输出:1 2 3
注意事项
必须在左括号的右侧和右括号的左侧各加一个空格,否则会报错。
test命令,使用标准的数学比较符号来表示字符串的比较 ,而 用文本符号来表示数值的比较
大于符号或小于符号必须要转义 ,否则会被理解成重定向。
[[ ]]
作用
条件判断
使用[[]]条件判断结构,与[]有以下区别: 本质上,[]和test是命令,而[[]]是关键字,所以重定向等字符在[]中会被认为成重定向,而在[[]]中是比较符号的意思。 &&、||、<和> 操作符能够正常存在于[[]]条件判断结构中,但是如果出现在[]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不使用双括号, 则为if [ $a != 1] && [ $a != 2 ]或者if [ $a != 1 -a $a != 2 ] [[]]支持字符串的模式匹配,[]不支持。使用=或==进行字符串比较,等号右边的可以作为一个模式,比如[[ "hello" == hell? ]]为真。模式匹配不能加引号,否则会作为固定字符串,如[[ "hello" == "hell?" ]]为假。 [[]]支持算术扩展,而[]不支持。如if [[ 1+2 -eq 3 ]],而if [ 1+2 -eq 3 ]则会报错。
返回状态码
本质上,bash把[[]]中的表达式看作一个单独的元素,并返回一个退出状态码。 [[ 1 -gt 0 ]] echo $? # 输出0 [[ 1 -gt 2 ]] echo $? # 输出1 如果[[]]内的表达式为真,则返回退出码0,这也是其他所有命令执行正常时所返回的退出码。 因此,如果用[[]]作为if的判断条件,道理是和判断一个命令或函数是否顺利执行是一样的。
注意事项
逻辑组合可以不使用test的-a,-o而使用&& ||
EOF
test
概要
Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示
let
( )
作用
命令组
(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。
命令替换
格式为 $(command),相当于 `command`。shell遇到此格式,会先执行 command 命令,得到标准输出,再将此输出放回到原来命令 SCRIPTPATH=$(dirname $0) # sh脚本的相对目录
初始化数组
Shell 数组用括号来表示,元素用"空格"符号分割开。 array=(a b c) echo ${array[1]} # 输出b
注意事项
(( ))
$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。
C语言规则运算
表达式 $((exp)),其中exp只要符合C语言规则的运算符即可,包括加减乘除、+=、<=、>=等。 进行不同进位(如二进制、八进制、十六进制)运算时,输出结果会全都自动转化成十进制。 echo $((2*2+(1-2))) # 输出3 a=1 echo $((a++)) # 输出2,且从此之后a=2 echo $((2#10+4)) # 输出6,在10前面的2#表示这是个二进制 echo $((a<2)) # 输出1。如果为假,则输出0。
重定义变量值
在((exp))中可以对变量进行定义或重新赋值,且之后脚本全部有效(不是像()那样只在子进程有效)。 a=1 ((a=2)) echo $a # 输出2
算术比较
在((exp))中可以进行算术比较(不能进行字符串比较),双括号中的变量可以省略$符号前缀,当然也可以带着。 a=1 ((a==1)) && echo "true" # 输出 true (($a==1)) && echo "true" # 输出 true
/dev/null
作用
一个特殊的设备文件
丢弃一切写入其中的数据
位桶(bit bucket)或者黑洞(black hole)
通常被用于丢弃不需要的输出流,或作为用于输入流的空文件
等价于一个只写文件
实例
清空文件
cat /dev/null > /home/omc/h.txt
同样效果
: > /var/log/messages
/dev/zero
作用
一个特殊的文件
读它的时候,它会提供无限的空字符
用它提供的字符流来覆盖信息
产生一个特定大小的空白文件
扩展模式
Bash 是先进行扩展,再执行命令。因此,扩展的结果是由 Bash 负责的,与所要执行的命令无关。命令本身并不存在参数扩展,收到什么参数就原样执行。 模式扩展与正则表达式的关系是,模式扩展早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是优点是简单和方便。 Bash 允许用户关闭扩展。 $ set -o noglob # 或者 $ set -f 下面的命令可以重新打开扩展。 $ set +o noglob # 或者 $ set +f
波浪线扩展
波浪线~会自动扩展成当前用户的主目录。
~
# 进入 /home/me/foo 目录 $ cd ~/foo
~user
~user表示扩展成用户user的主目录。 $ echo ~foo /home/foo $ echo ~root /root 如果~user的user是不存在的用户名,则波浪号扩展不起作用。 $ echo ~nonExistedUser ~nonExistedUser
~+
~+会扩展成当前所在的目录,等同于pwd命令。 $ cd ~/foo $ echo ~+ /home/me/foo
? 字符扩展
?字符代表文件路径里面的任意单个字符,不包括空字符。比如,Data???匹配所有Data后面跟着三个字符的文件名。
* 字符扩展
*字符代表文件路径里面的任意数量的字符,包括零个字符。 注意:*不会匹配隐藏文件(以.开头的文件)。 显示所有隐藏文件 $ echo .* # 与方括号扩展结合使用, # 只显示正常的隐藏文件,不显示 . 和 .. 这两个特殊文件 $ echo .[!.]* *字符扩展也属于文件名扩展,只有文件确实存在的前提下才会扩展。如果文件不存在,就会原样输出。 # 当前目录不存在 c 开头的文件 $ echo c*.txt c*.txt 上面例子中,当前目录里面没有c开头的文件,导致c*.txt会原样输出 *只匹配当前目录,不会匹配子目录。 # 子目录有一个 a.txt # 无效的写法 $ ls *.txt # 有效的写法 $ ls */*.txt
方括号扩展
大括号扩展
变量扩展
子命令扩展
算术扩展
数据流
类型
标准输入 standard input ,文件描述符用数字0表示 stdin
正确输出 standard output 1 文件描述符用数字1表示 stdout
错误输出 standard error 2 文件描述符用数字2 表示 stderr
重定向
> 即 1>
正确输出重定向
>>
正确追加输出重定向
2>
错误输出重定向
2>>
错误追加输出重定向
&>
全部重定向,不管正确与否,输出重定向
&>>
不管正确与否,追加输出重定向
<
输入重定向
2>&1
将标准错误输出重定向到标准输出
1>&2
注意
重定向可以多个组合使用
cat $filename 2>/dev/null >/dev/null
异步任务
wait
作用
等待作业号或者进程号指定的进程退出,返回最后一个作业或进程的退出状态状态
没有制定参数,则等待所有子进程的退出,其退出状态为0
wait命令可以让父脚本暂停,直到指定的进程(比如子脚本)结束
实例
sleep 10 & sleep 5& wait
等待10秒后,退出
sleep 10 & sleep 5& wait $!
$!表示上个子进程的进程号
wait等待一个子进程,等待5秒后,退出
sleep
&
nohup
命名管道
命名管道用来在 两个进程之间建立连接,也可以像其它类型的文件一样使用。命令管道的行为类似于文件,但实际上形成了先入先出(FIFO)的缓冲。和普通(未命令的)管道一样, 数据从一端进入,然后从另一端出现
文本处理
cat
正序查看
参数
-n
显示行号
-b
忽略空行
-E
在每行结束处显示 $
-s
多个连续空行压缩为一行
tac
倒着显示
nl
sort
uniq
cut
paste
wc
head
显示文件前若干行
参数
head -n number filename
tail
显示文件后若干行
参数
-n
tail -n number filename
显示filename文件尾部number行内容
tail -n +number filename
从第number行显示文件内容
grep(文本过滤命令)
格式: grep 匹配条件 处理文件 都是以行为单位进行匹配
参数
-a
不要忽略二进制数据。
-d<进行动作>
当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-E
将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-i
忽略字符大小写的差别。
grep -i root /var/log/test.log
-n
在显示符合范本样式的那一列之前,标示出该列的编号。
-s
不显示错误信息。
-v
反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行
-a
将 binary 文件以 text 文件的方式搜寻数据
-c
计算找到 '搜寻字符串' 的次数
ps -ef|grep -c svn
--color=auto
可以将找到的关键词部分加上颜色
-f
从文件中读取关键字在另一个文件中搜索
grep -f test file
在test文件中获取关键字,在file中查找
grep -f test -n file
在test文件中获取关键字,在file中查找,并显示行号
-r
递归查找
符号
^
在 [] 内代表『反向选择』
在 [] 之外代表定位在行首的意义
[^]
匹配一个不在指定范围内的字符
grep ^[^test] file
找出不是以test开头的行
$
匹配字符串结尾
grep -n '\.$' regular_express.txt
行尾结束为小数点 (.)
*
重复前一个字符, 0 到无穷多次,注意是前一个字符
grep -n 'goo*g' regular_express.txt
字串开头与结尾都是 g,但是两个 g 之间仅能存在至少一个 o
\?
字符出现 [0-1 次 ]
\+
字符出现 [1- 任意次 ]
[ ]
匹配一个指定范围内的字符
{ }
用法
\{n\}
字符出现 [n 次 ]
\{m,n\}
字符出现 [ 最少出现 m 次%2c最多出现 n 次 ]
\{0,n\}
字符出现 [0-n 次 ]
\{m\}
字符出现 [ 至少 m 次 ]
注意
限定连续字符范围
只针对前一个字符
{ 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用字符 \ 来让他失去特殊意义
.
匹配一个非换行符的字符
grep -n 'g..d' regular_express.txt
找出四字符连续且两头为gd的
.*
任意数量任意字符
\(..\)
\<
锚定单词的开始
'\<grep'匹配包含以grep开头的单词的行
\>
锚定单词的结束
'grep\>'匹配包含以grep结尾的单词的行
\w
匹配文字和数字字符,即[A-Za-z0-9]
G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p
\W
\w的反置形式,匹配一个或多个非单词字符,如点号句号等
\b
单词锁定符,如: '\bgrep\b'只匹配grep
实例
grep root passwd
#匹配root关键字
grep ^root passwd
#匹配开始字符串为root
grep root$ passwd
#匹配字符串结尾为root
grep -i root passwd
#忽略大小写匹配root
grep -E "root|ROOT" passwd
#扩展正则表达式,匹配root或ROOT
grep "root*" passwd
cat /etc/passwd | grep root
编辑找到的行
与正则表达式结合
grep -n 't[ae]st' regular_express.txt
搜寻 test 或 taste 这两个单字
grep -n '[^g]oo' regular_express.txt
搜索到有 oo 的行,但不想要 oo 前面有 g
grep -n '[^a-z]oo' regular_express.txt
oo 前面不想要有小写字节
grep '^a' test.log
列出行首以a开头的行
grep -n '^[^a-zA-Z]' regular_express.txt
列出非英文字母开头的行
grep -n '^$' regular_express.txt
空行
grep -n 'g.*g' regular_express.txt
g 开头与 g 结尾的行,当中的字符可有可无
注意
默认不支持扩展表达式,加-E 选项开启 ERE。如果不加-E 使用花括号要加转义符\{\}
末尾可以跟多个文件
egrep
注意
支持基础和扩展表达式
sed(报告生成器)
语法格式 sed [选项] [sed命令] [输入文件] 说明: 1,注意sed软件以及后面选项,sed命令和输入文件,每个元素之间都至少有一个空格。 2,sed -commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令 3,sed -commands 既可以是单个sed命令,也可以是多个sed命令组合。 4,input -file (输入文件)是可选项,sed还能够从标准输入如管道获取输入。
注意
默认不支持扩展表达式,加-r 选项开启 ERE。如果不加-r 使用花括号要加转义符\{\}
工作原理
sed读取一行,首先将这行放入到缓存中 然后,才对这行进行处理 处理完成以后,将缓冲区的内容发送到终端 存储sed读取到的内容的缓存区空间称之为:模式空间(Pattern Space)
参数
-n (no)
取消默认的sed软件的输出,常与sed命令的p连用。
-e (entry)
一行命令语句可以执行多条sed命令
-r (ruguler)
使用扩展正则表达式,默认情况sed只识别基本正则表达式
-i (inside)
直接修改文件内容,而不是输出到终端,如果不使用-i选项sed软件只是修改在内存中的数据,并不会影响磁盘上的文件
命令参数
a (append)
追加,在指定行后添加一行或多行文本
c (change)
取代指定的行
d (delete)
删除指定的行
i (insert)
插入,在指定行前添加一行或多行文本
p (print)
打印模式空间内容,通常p会与选项-n一起使用
!
对指定行以外的所有行应用命令
实例(单引、双引均可)
添加
例子1:添加单行 [root@ken ~]# sed ‘1a nihao’ test root:x:0:0:root:/root:/bin/bash nihao bin:x:1:1:bin:/bin:/sbin/nologin 例子2:添加单行 [root@ken ~]# sed ‘2a nihao’ test root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin nihao 例子3:添加多行 [root@ken ~]# sed ‘2a 1\n2\n3\n4\n5’ test root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin 1 2 3 4 5 daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin 例子4:行尾添加 [root@ken ~]# sed ‘$a nihao’ test root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin nihao 增i 例子5:单行添加 [root@ken ~]# sed ‘1i nihao’ test nihao root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin 例子6:添加多行 [root@ken ~]# sed ‘1i 1\n2\n3\n4’ test 1 2 3 4 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
行后和行前添加新行
行后:sed 's/pattern/&\n/g' <file>
行前:sed 's/pattern/\n&/g' <file>
&代表pattern
在第一行前插入文本
sed -i '1 i\待插入值' <file>
在最后一行插入
sed -i '$ a\待插入值' <file>
在匹配行前插入
sed -i '/pattern/ i 待插入值"' <file>
在匹配行后插入
sed -i '/pattern/ a 待插入值' <file>
在匹配串后加串
sed -i '/string1/astring2' <file>
在string1后加string2
删除
例子1:删除指定行 [root@ken ~]# sed ‘1d’ test bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin 例子2:删除多行 [root@ken ~]# sed ‘1,9d’ test operator:x:11:0:operator:/root:/sbin/nologin 例子3:删除全文 [root@ken ~]# sed ‘d’ test 例子4:删除指定行到结尾的行 [root@ken ~]# sed ‘3,$d’ test root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
删除行首空格
sed 's/^[ ]*//g' <file>
sed 's/^ *//g' <file>
sed 's/^[[:space:]]*//g' <file>
删除文本中空行和空格组成的行以及#号注释的行
grep -v ^# <file> | sed /^[[:space:]]*$/d | sed /^$/d
删除批注行
cat <file> |grep 'MAN'| sed 's/^#.*$//g'
删除空白行
cat <file> |grep 'MAN'| sed 's/^#.*$//g'| sed '/^$/d'
删除文档的第K行
sed -i 'Kd' <file>
删除文档的最后一行
sed -i '$d' <file>
删除文件中包含QWQ关键字开头的所有行
sed -i '/^QWQ/d' <file>
删除文件中包含QWQ关键字的所有行
sed -i '/QWQ/d' <file>
删除以mail开头的行,到以ftp开头行的所有内容
sed -i '/^mail/,/^ftp/d' <file>
删除8行到14行的所有内容
sed -i '8,14d' <file>
删除第5行到以ftp开头的所有行的内容
sed -i '5,/^ftp/d' <file>
删除注释行和空行
sed -i '/^#/d;/^$/d' <file>
替换
sed命令,选项: “s”:单独使用–>将每一行中第一处匹配的字符串进行替换==>sed命令 “g”:每一行进行全部替换–>sed命令s的替换标志之一(全局替换),非sed命令。 “-i”:修改文件内容–>sed软件的选项,注意和sed命令i区别。 例子1:改指定的行 [root@ken ~]# sed ‘1c nihao’ test nihao bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin 例子2:改指定的几行 [root@ken ~]# sed ‘1,3c nihao’ test nihao adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
把当前目录下file里的shan都替换为hua
sed -i "s/shan/hua/g" <file>
使用变量替换(使用双引号)
sed -e "s/$var1/$var2/g" <file>
每一行若为.的换成!
sed -i 's/.*\.$/\!/g' <file>
特别注意
&
awk(行编辑器)
注意
支持 egrep 所有的正则表达式
more
分页显示,含文件百分比
参数
+num
从第num行开始显示
-num
定义屏幕大小,为num行
+/pattern
从pattern 前两行开始显示
more +/MAIL /etc/profile
从profile中的第一个MAIL单词的前两行开始显示
-c
从顶部清屏然后显示
-s
多个连续空行压缩为一行
动作指令
注意
more不能后退
less
和more类似,但是有后退功能
常用工具
常用函数
根据key获取value
# 根据key获取value(适用于key=value格式的数据) # 调用格式 info key <file> function info(){ info_line=`sed -n "/^$1/p" $2` if [[ -z $info_line ]];then echo "$1为空,请核查" exit 4 fi tmp_str=$1 tmp_len=${#tmp_str} echo ${info_line:${tmp_len}} }
遍历目录下所有文件
# 遍历目录下所有文件(包括子目录) # 调用格式 dirTraversal 被遍历目录 回调方法(参数为具体文件) function dirTraversal(){ for element in `ls $1` do dir_or_file=$1"/"$element if [ -d $dir_or_file ] then dirTraversal $dir_or_file else # 回调 $2 $dir_or_file fi done }
常用命令
搜索
find
locate
which
whereis
grep
more
less
head
tail
cat
wc
sort
目录堆栈
cd -
Bash 可以记忆用户进入过的目录。默认情况下,只记忆前一次所在的目录,cd -命令可以返回前一次的目录
pushd
第一次使用pushd命令时,会将当前目录先放入堆栈,然后将所要进入的目录也放入堆栈,位置在前一个记录的上方。以后每次使用pushd命令,都会将所要进入的目录,放在堆栈的顶部。 # 当前处在主目录,堆栈为空 $ pwd /home/me # 进入 /home/me/foo # 当前堆栈为 /home/me/foo /home/me $ pushd ~/foo # 进入 /etc # 当前堆栈为 /etc /home/me/foo /home/me $ pushd /etc # 进入 /home/me/foo # 当前堆栈为 /home/me/foo /home/me $ popd # 进入 /home/me # 当前堆栈为 /home/me $ popd # 目录不变,当前堆栈为空 $ popd
pushd命令的用法类似cd命令,可以进入指定的目录
popd
popd命令不带有参数时,会移除堆栈的顶部记录,并进入新的堆栈顶部目录(即原来的第二条目录)。
dirs
查看堆栈信息
参数
-c
清空目录栈。
-l
用户主目录不显示波浪号前缀,而打印完整的目录。
-p
每行一个条目打印目录栈,默认是打印在一行。
-v
每行一个条目,每个条目之前显示位置编号(从0开始)。
+N
N为整数,表示显示堆顶算起的第 N 个目录,从零开始。
-N
N为整数,表示显示堆底算起的第 N 个目录,从零开始。
防火墙
查看状态
systemctl start firewalld
开机自启
systemctl enable firewalld
expr
trap
echo
参数
-n
echo输出的文本末尾会有一个回车符。-n参数可以取消末尾的回车符,使得下一个提示符紧跟在输出内容的后面。
-e
-e参数会解释引号(双引号和单引号)里面的特殊字符(比如换行符\n)。如果不使用-e参数,即默认情况下,引号会让特殊字符变成普通字符,echo不解释它们,原样输出。
实例
type
Bash 本身内置了很多命令,同时也可以执行外部程序。type命令用来判断命令的来源。
-a
如果要查看一个命令的所有定义,可以使用type命令的-a参数。
-t
type命令的-t参数,可以返回一个命令的类型:别名(alias),关键词(keyword),函数(function),内置命令(builtin)和文件(file)
whoami
export
hostname
实例
hostname
显示主机名
hostname -i
显示主机IP
hostname test100
修改主机名为test100
shift
shift命令表示参数向左偏移,后面可跟数字(数字大小在参数个数范围内),数字表示偏移个数 实例 脚本: #!/bin/sh echo "first args:$1, args counts: $#" shift 2 echo "first args:$1, args counts: $#" 执行结果: $ sh shift.sh 1 2 3 4 5 first args:1, args counts: 5 first args:3, args counts: 3
getopts (getopts option_string variable)
getopts会将获取到的选项所对应的参数 用选项后面加“:”来表示选项后面需要加参数 示例:getopts ahf: var 告诉getopts查找-a、-h、-f选项,其中f选项后面需要跟一个参数,获取到的选项都保存到变量var中
错误模式
详细错误报告模式
如果getopts检测到一个无效的选项,var的值会被设置为(?);如果getopts检测到一个后面需要跟参数的选项,后面没有参数,var的值也会被设置为(?)
抑制错误报告模式
如果getopts检测到一个无效的选项,var的值会被设置为(?),变量OPTARG会被设置为这个无效的选项;如果getopts检测到一个后面需要跟参数的选项,后面没有参数,var的值会被设置为(:),变量OPTARG会被设置为这个无效的选项
set
set命令用来修改子 Shell 环境的运行参数,即定制环境
参数
无
显示所有的环境变量和 Shell 函数
-u ( -o nounset )
默认情况下,脚本中用到不存在的变量时会自动忽略并继续执行,有些时候我们不希望如此。此时脚本在头部加上set -u,遇到不存在的变量就会报错,并停止执行。 如下 #!/usr/bin/env bash set -u echo $a echo bar 运行结果如下。 $ bash script.sh bash: script.sh:行4: a: 未绑定的变量 -u还有另一种写法-o nounset,两者是等价的。 set -o nounset
-x ( -o xtrace )
默认情况下,脚本执行后,只输出运行结果,没有其他内容。如果多个命令连续执行,它们的运行结果就会连续输出。有时会分不清,某一段内容是什么命令产生的。 set -x用来在运行结果之前,先输出执行的那一行命令。如要关闭该功能则set +x #!/usr/bin/env bash set -x echo bar 执行上面的脚本,结果如下。 $ bash script.sh + echo bar bar -x还有另一种写法-o xtrace。 set -o xtrace
特别注意,该选项作用于当前shell进程的所有命令
-e ( -o errexit )
set +e 关闭功能 -e还有另一种写法-o errexit
使得脚本只要发生错误,就终止执行
注意
不适用于管道命令(set -o pipefail解决)
-n ( set -o noexec )
不运行命令,只检查语法是否正确
-f ( set -o noglob )
表示不对通配符进行文件名扩展
用法
set -euxo pipefail
set -eux set -o pipefail
bash -euxo pipefail script.sh
trap
用来在 Bash 脚本中响应系统信号 trap [动作] [信号1] [信号2] ...
信号
注意
trap命令必须放在脚本的开头。否则,它上方的任何命令导致脚本退出,都不会被它捕获
实例
trap 'rm -f "$TMPFILE"' EXIT
#!/bin/bash trap 'rm -f "$TMPFILE"' EXIT TMPFILE=$(mktemp) || exit 1 ls /etc > $TMPFILE if grep -qi "kernel" $TMPFILE; then echo 'find' fi 不管是脚本正常执行结束,还是用户按 Ctrl + C 终止,都会产生EXIT信号,从而触发删除临时文件
脚本遇到EXIT信号时,就会执行rm -f "$TMPFILE"
多条命令同时触发
function egress { command1 command2 command3 } trap egress EXIT
mkfifo
创建命令管道
kill
实质是操作系统向进程发送信号
killall
ps
top
jobs
fg
bg
uname
service
systemctl
dmesg
printf
printf format-string [arguments...]
format-string
格式控制字符串
arguments
参数列表
实例
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
格式化
%s
输出一个字符串
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来
%d
整型输出
%c
输出一个字符
%f
输出实数,以小数形式输出
%-4.2f 指格式化为小数,其中 .2 指保留2位小数
启动流程
内核的引导
打开电源,BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。此时操作系统接管硬件,接着,首先读入 /boot 目录下的内核文件
运行 init
init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。
运行级别
0
系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
1
单用户工作状态,root权限,用于系统维护,禁止远程登陆
2
多用户状态(没有NFS)
3
完全的多用户状态(有NFS),登陆后进入控制台命令行模式
4
系统未使用,保留
5
X11控制台,登陆后进入图形GUI模式
6
系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
用途
读取配置文件
CentOS5之前
/etc/inittab
CentOS6
/etc/inittab, /etc/init/*.conf
CentOS7
/usr/lib/systemd/system、 /etc/systemd/system
扫描并触发自启项
系统初始化
建立终端
用户登录系统
磁盘
常用命令
du
作用
显示每个文件和目录的磁盘使用空间
参数
-a
显示目录中文件的大小 单位 KB
-b
显示目录中文件的大小,以字节byte为单位。
-c
显示目录中文件的大小,同时也显示总和;单位KB。
-k 、 -m
显示目录中文件的大小,-k 单位KB,-m 单位MB.
-s
仅显示目录的总值,单位KB。
-h
以K M G为单位显示
-x
以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过
-L
显示选项中所指定符号链接的源文件大小
-S
显示个别目录的大小时,并不含其子目录的大小
实例
du -hs xxxx/*
显示某个目录下所有文件的大小,一级
du –hs xxxx
显示某个目录的总大小
du -hs
显示当前目录的大小
du -h --max-depth=1 /xxx/
查看指定目录中的一级子目录的大小
df
作用
显示磁盘分区上可以使用的磁盘空间
参数
-a查看全部文件系统
-h
以KB、MB、GB的单位来显示
dd
磁盘备份
lsblk -f
查看分区信息
名称
UUID
文件系统类型
挂载情况
挂载
临时
永久
/etc/fatab
系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录
file system
要挂载的分区或存储设备
标识方式
内核名称
UUID
label
使用 UUID 或是 label 的好处在于它们与磁盘顺序无关。如果你在 BIOS 中改变了你的存储设备顺序,或是重新拔插了存储设备,或是因为一些 BIOS 可能会随机地改变存储设备的顺序,那么用 UUID 或是 label 来表示将更有效
dir
挂载位置
type
要挂载设备或是分区的文件系统类型
auto
设置成auto类型,mount 命令会猜测使用的文件系统类型
ext2
ext3
ext4
reiserfs
xfs
smbfs
jfs
swap
ntfs
options
挂载时使用的参数,注意有些mount 参数是特定文件系统才有的
defaults
使用文件系统的默认挂载参数,例如 ext4 的默认参数为:rw, suid, dev, exec, auto, nouser, async
auto
在启动时或键入了 mount -a 命令时自动挂载
noauto
只在你的命令下被挂载
exec
允许执行此分区的二进制文件
noexec
不允许执行此文件系统上的二进制文件
ro
以只读模式挂载文件系统
rw
以读写模式挂载文件系统
user
允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexec, nosuid, nodev 参数
users
允许所有 users 组中的用户挂载文件系统
nouser
只能被 root 挂载
owner
允许设备所有者挂载
sync
I/O 同步进行
async
I/O 异步进行
dev
解析文件系统上的块特殊设备
dump
dump 工具通过它决定何时作备份. dump 会检查其内容,并用数字来决定是否对这个文件系统进行备份
允许的数字是 0 和 1 。0 表示忽略, 1 则进行备份
pass
fsck 读取 <pass> 的数值来决定需要检查的文件系统的检查顺序
允许的数字是0, 1, 和2。 根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查
内存
资源查看与释放
内存占用前10名
ps -auxf | sort -nr -k 4 | head -10
CPU占用前10名
ps -auxf | sort -nr -k 3 | head -10
free
软件管理
yum
Yum (Yellow dog Updater, Modified) 是一个基于 RPM 包管理的字符前端软件包管理器,能够从指定的服务器自动下载 RPM 包并且安装,可以自动解决处理包依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装,更方便的添加/删除/更新RPM包,便于管理系统的更新问题 服务器端:在服务器上面存放了所有的RPM软件包,然后以相关的功能去分析每个RPM文件的依赖性关系,将这些数据记录成文件存放在服务器的某特定目录内。 客户端:如果需要安装某个软件时,先下载服务器上面记录的依赖性关系文件(可通过WWW或FTP方式),通过对服务器端下载的纪录数据进行分析,然后取得所有相关的软件,一次全部下载下来进行安装。
源管理
/etc/yum.conf
[main] cachedir=/var/cache/yum //yum 缓存的目录,yum 在此存储下载的rpm 包和数据库,默认设置为/var/cache/yum keepcache=0 //安装完成后是否保留软件包,0为不保留(默认为0),1为保留 debuglevel=2 //Debug 信息输出等级,范围为0-10,缺省为2 logfile=/var/log/yum.log //yum 日志文件位置。用户可以到/var/log/yum.log 文件去查询过去所做的更新。 pkgpolicy=newest //包的策略。一共有两个选项,newest 和last,这个作用是如果你设置了多个repository,而同一软件在不同的repository 中同时存在,yum 应该安装哪一个,如果是newest,则yum 会安装最新的那个版本。如果是last,则yum 会将服务器id 以字母表排序,并选择最后的那个服务器上的软件安装。一般都是选newest。 distroverpkg=redhat-release //指定一个软件包,yum 会根据这个包判断你的发行版本,默认是redhat-release,也可以是安装的任何针对自己发行版的rpm 包。 tolerant=1 //有1和0两个选项,表示yum 是否容忍命令行发生与软件包有关的错误,比如你要安装1,2,3三个包,而其中3此前已经安装了,如果你设为1,则yum 不会出现错误信息。默认是0。 exactarch=1 //有1和0两个选项,设置为1,则yum 只会安装和系统架构匹配的软件包,例如,yum 不会将i686的软件包安装在适合i386的系统中。默认为1。 retries=6 //网络连接发生错误后的重试次数,如果设为0,则会无限重试。默认值为6. obsoletes=1 //这是一个update 的参数,具体请参阅yum(8),简单的说就是相当于upgrade,允许更新陈旧的RPM包。 plugins=1 //是否启用插件,默认1为允许,0表示不允许。我们一般会用yum-fastestmirror这个插件。 bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum # Note: yum-RHN-plugin doesn't honor this. metadata_expire=1h installonly_limit = 5 # PUT YOUR REPOS HERE OR IN separate files named file.repo # in /etc/yum.repos.d
repo文件格式
[serverid] name=Some name for this server baseurl=url://path/to/repository/
serverid
区别各个不同的repository,必须有一个独一无二的名称
name
对repository 的描述,支持像$releasever $basearch这样的变量
baseurl
支持的协议有 http:// ftp:// file:// 三种。baseurl 后可以跟多个url,你可以自己改为速度比较快的镜像站,但baseurl 只能有一个 baseurl=url://server1/path/to/repository/ url://server2/path/to/repository/ url://server3/path/to/repository/
镜像服务器地址,只能写具体的确定地址
mirrorlist
镜像服务器的地址列表,里面有很多的服务器地址。
概要
baseurl和mirrorlist都是指向yum源的地址,不同点是包含地址的多少。
gpgcheck
有1和0两个选择,分别代表是否是否进行gpg(GNU Private Guard) 校验,以确定rpm 包的来源是有效和安全的
exclude
排除某些软件在升级名单之外,可以用通配符,列表中各个项目要用空格隔开,这个对于安装了诸如美化包,中文补丁的朋友特别有用
failovermethod
failovermethode 有两个选项roundrobin 和priority,意思分别是有多个url可供选择时,yum 选择的次序,roundrobin 是随机选择,如果连接失败则使用下一个,依次循环,priority 则根据url 的次序从第一个开始。如果不指明,默认是roundrobin
多个url的选择次序
gpgkey
变量含义
$releasever:代表发行版的版本,从[main]部分的distroverpkg获取,如果没有,则根据redhat-release包进行判断。
$arch:cpu体系,如i686%2cathlon等
$basearch:cpu的基本体系组,如i686和athlon同属i386,alpha和alphaev6同属alpha。
插件
yum-priorities
用来设置yum在调用软件源时的顺序的。因为官方提供的软件源,都是比较稳定和被推荐使用的。因此,官方源的顺序要高于第三方源的顺序。如何保证这个顺序,就需要安装yum-priorities这插件
CentOS-Base.repo
网络源的配置文件
CentOS-Sources.repo
CentOS-Media.repo
本地源的配置文件。使用光盘挂载后调用的文件
CentOS-Vault.repo
最近新版本的加入的老版本的yum源配置
命令
yum clean packages
清除缓存目录下的软件包,清空的是(/var/cache/yum)下的缓存
yum clean headers
清除缓存目录下的 headers
yum clean oldheaders
清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders)
清除缓存目录下的软件包及旧的headers
yum list
显示所有已经安装和可以安装的程序包
yum list rpm
显示安装包信息rpm
yum list httpd
这里是可获得包,说明还没有安装
yum info rpm
显示安装包rpm的详细信息
yum -y install httpd
yum remove httpd
删除程序包httpd ,也就是卸载。
yum deplist rpm
查看程序rpm依赖情况
yum check-update
检查可更新的程序
yum update
全部更新,升级所有包,以及升级软件和系统内核,这就是一键升级。他可以更新CentOS的内核到最新版本。
yum update package1
更新指定程序包package1
yum upgrade package1
更新指定程序包package1
组
yum makecache
参数
--enablerepo=elrepo-kernel
指定数据源
rpm
RPM无法解决软件包的依赖关系
rpm --import
常见配置文件
/etc/fstab
/etc/passwd
账号名称:账号密码:账号UID:账号GID:用户说明:用户家目录:Shell解释器
/etc/shadow
帐号名称:密码:最近更动密码的日期:密码不可被更动的天数:密码需要重新变更的天数:密码需要变更期限前的警告期限:密码过期的受限时间:帐号失效日期:保留
/etc/group
/etc/issue
在登录提示符前的输出信息。通常包括系统的一段短说明或欢迎信息。内容由系统管理员确定。
登陆前提示信息
/etc/motd
成功登录后自动输出,内容由系统管理员确定,经常用于通告信息,如计划关时间的警告。
登陆后提示信息
配置脚本
修改过别忘了source 命令一下
/etc/profile
永久生效,对所有用户有效,需要重启
全局配置文件,/etc/profile会首先执行/etc/profile.d/目录下的所有*.sh文件
/etc/bashrc
永久生效,对所有用户有效,无需重启
/etc/profile.d/*
/etc/profile会首先执行/etc/profile.d/目录下的所有*.sh文件
~/.profile
profile是unix上才有的
~/.bash_profile
bash_profile是Linux下有的
~/.bash_logout
~/.bash_login
~/.bashrc
则只对当前用户有用,创建一些个性化配置
~/.bash_file
~/.ssh
非交互式登录
~/.bashrc -->/etc/bashrc -->.etc/profile.d/*
交互式登陆
/etc/profile -->/etc/profile.d/* -->~/.bash_profile -->~/ .bash_login-->~/.bashrc -->/etc/bashrc
/etc/securetty
/etc/default/useradd
添加用户的默认信息的文件
/etc/sysconfig/network-scripts/ifcfg-*
DEVICE=eth0 ## 物理设备名,eth0为第一块网卡;eth1为第二块网卡 HWADDR=00:0C:29:84:0C:21 ## 网卡的MAC地址,48位 TYPE=Ethernet ## 以太网 UUID=09ae6890-2925-4ca0-9cbc-e937593624f8 ## 唯一的一个用户标识,相当于身份证号码!如查看磁盘设备的UUID使用blkid命令 ONBOOT=yes ## 控制网卡是否开机启动 NM_CONTROLLED=yes ##是否通过networkmanager管理网卡设备 BOOTPROTO=dhcp ## proto取下列值之一:none,引导时不使用协议;static,静态分配地址;bootp,使用BOOTP协议;dhcp,使用DHCP协议 IIPADDR=192.168.17.128 ## IP地址 NETMASK=255.255.255.0 ## 子网掩码,划分网络位和主机位 DNS2=202.106.0.20 ## DNS是把baidu.com变成了baidu服务器IP。DNS就是域名和IP的解析工具 DNS1=8.8.8.8 GATEWAY=192.168.0.1 ## 网关地址,路由器的地址 USERCTL=no PEERDNS=yes IPV6INIT=no
网卡文件
/etc/sysconfig/network
/etc/hosts(/etc/hostname)
IP地址与域名快速解析的文件
DNS优先级:dns缓存 > hosts > dns服务
格式:ip地址 主机名/域名 (主机别名-可有可无)
/etc/resolv.conf
domain和search不能共存;如果同时存在,后面出现的将会被使用 在NetworkManager开启的时候,/etc/resolv.conf文件在每次NetworkManager服务重启的过程中会被重写
设置DNS服务器的IP地址及DNS域名
参数
当domain、search同时存在时,domain失效
nameserver
解析域名时使用该地址指定的主机为域名服务器。其中域名服务器是按照文件中出现的顺序来查询的,且只有当第一个nameserver没有反应时才查询下面的nameserver nameserver做多三个(不是很确定) timeout默认是5秒 attempts默认是2次,也就是解析域名尝试的次数
定义DNS服务器的IP地址
domain
声明主机的域名。很多程序用到它,如邮件系统;当为没有域名的主机进行DNS查询时,也要用到。如果没有域名,主机名将被使用,删除所有在第一个点( .)前面的内容
定义本地域名
search
它的多个参数指明域名查询顺序。当要查询没有域名的主机,主机将在由search声明的域中分别查找
定义域名的搜索列表
sortlist
允许将得到域名结果进行特定的排序。它的参数为网络/掩码对,允许任意的排列顺序。
对返回的域名进行排序
/etc/rc.d/init.d
类似windows中的注册表,在系统启动的时候执行 对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d,每个目录下都是到init.d目录的一部分脚本一些链接,真正干活到init.d里的脚本 在rc*.目录下,文件都是S数字/K数字开头,S表示开启,K表示停止,其中数字表示顺序,从小到大执行。 /etc/rc.d/rc.local 用于添加开机启动命令。会在用户登陆之前读取,这个文件中写入了什么命令,在每次系统启动时都会执行一次。也就是说,如果有任何需要在系统启动时运行的工作,则只需写入 /etc/rc.d/rc.local 配置文件即可。
服务的启动脚本
/etc/rc.local
/etc/rc.d/rc.local 用于添加开机启动命令。该文件默认没有可执行权限,如果需要开启执行,需要手动添加x权限 /etc/rc.local是/etc/rc.d/rc.local的软连接
/etc/yum.repos.d
本地yum源,红帽系列
/etc/sysconfig/i18n
用户管理
id
su
sudo
chown
chgrp
useradd
usermod
adduser
groupadd
groupdel
passwd
文件(目录)管理
mktemp
为安全创建临时文件而设计的,不会检查临时文件是否存在,但是它支持唯一文件名和清除机制,权限是只有用户本人可读写
参数
无
创建一个临时文件
-d
mktemp -d
创建一个临时目录
-p
mktemp -p /home/ruanyf/
指定临时文件所在的目录。默认是使用$TMPDIR环境变量指定的目录,如果这个变量没设置,那么使用/tmp目录
-t
指定临时文件的文件名模板,模板的末尾必须至少包含三个连续的X字符,表示随机字符,建议至少使用六个X。默认的文件名模板是tmp.后接十个随机字符。 $ mktemp -t mytemp.XXXXXXX /tmp/mytemp.yZ1HgZV
文件属性操作
属性列表
a
即Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。
A
即Atime,告诉系统不要修改对这个文件的最后访问时间
b
不更新文件或目录的最后存取时间
c
将文件或目录压缩后存放。
C
d
当dump程序执行时,该文件或目录不会被dump备份。
D
检查压缩文件中的错误
e
E
F
i
即Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。
I
j
N
P
s
彻底删除文件,不可恢复,因为是从磁盘上删除,然后用0填充文件所在区域
S
即Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。
t
文件系统支持尾部合并(tail-merging)
u
当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件,用来防止意外删除文件或目录
X
可以直接访问压缩文件的内容。
命令
chattr
chattr +a test.txt chattr -a test.txt
-R
递归处理,将指定目录下的所有文件及子目录一并处理
-v
<版本编号> 设置文件或目录版本
-V
显示指令执行过程
+<属性>
开启文件或目录的该项属性。
-<属性>
关闭文件或目录的该项属性。
=<属性>
指定文件或目录的该项属性。
lsattr
scp(secure copy)
用来在两台主机之间加密传送文件。它的底层是 SSH 协议,默认端口是22。
场景
从本地系统到远程系统。
从远程系统到本地系统。
在本地系统的两个远程系统之间。
实例
本地文件复制到远程系统
复制本机文件到远程系统的基本语法如下。 # 语法 $ scp SourceFile user@host:directory/TargetFile # 示例 $ scp file.txt remote_username@10.10.0.2:/remote/directory 下面是复制整个目录。 # 将本机的 documents 目录拷贝到远程主机, # 会在远程主机创建 documents 目录 $ scp -r documents username@server_ip:/path_to_remote_directory # 将本机整个目录拷贝到远程目录下 $ scp -r localmachine/path_to_the_directory username@server_ip:/path_to_remote_directory/ # 将本机目录下的所有内容拷贝到远程目录下 $ scp -r localmachine/path_to_the_directory/* username@server_ip:/path_to_remote_directory/
远程文件复制到本地
从远程主机复制文件到本地的语法如下。 # 语法 $ scp user@host:directory/SourceFile TargetFile # 示例 $ scp remote_username@10.10.0.2:/remote/file.txt /local/directory 下面是复制整个目录的例子。 # 拷贝一个远程目录到本机目录下 $ scp -r username@server_ip:/path_to_remote_directory local-machine/path_to_the_directory/ # 拷贝远程目录下的所有内容,到本机目录下 $ scp -r username@server_ip:/path_to_remote_directory/* local-machine/path_to_the_directory/ $ scp -r user@host:directory/SourceFolder TargetFolder
两个远程系统之间的复制
本机发出指令,从远程主机 A 拷贝到远程主机 B 的语法如下。 # 语法 $ scp user@host1:directory/SourceFile user@host2:directory/SourceFile # 示例 $ scp user1@host1.com:/files/file.txt user2@host2.com:/files
参数
-i
scp -vCq -i private_key.pem ~/test.txt root@192.168.1.3:/some/path/test.txt
用来指定密钥
-P
scp -P 2222 user@host:directory/SourceFile TargetFile
用来指定远程主机的 SSH 端口。如果远程主机使用非默认端口22,可以在命令中指定。
-p
参数用来保留修改时间(modification time)、访问时间(access time)、文件状态(mode)等原始文件的信息。
-l
scp -l 80 yourusername@yourserver:/home/yourusername/* . 上面代码中,scp命令占用的带宽限制为每秒80K比特位,即每秒10K字节。
参数用来限制传输数据的带宽速率,单位是 Kbit/sec。对于多人分享的带宽,这个参数可以留出一部分带宽供其他人使用
-c
用来指定加密算法。
-C
表示是否在传输时压缩文件。
-q
用来关闭显示拷贝的进度条。
-v
参数用来显示详细的输出。
-r
参数表示是否以递归方式复制目录。
注意
如果传输的文件在本机和远程系统,有相同的名称和位置,scp会在没有警告的情况下覆盖文件
ls
pwd
mkdir
touch
cd
ln
rm
mv
cp
参数
-a
保留链接和文件属性,递归拷贝目录,相当于下面的d、p、r三个选项组合
-d
拷贝时保留链接
-f
删除已经存在目标文件而不提示
-i
覆盖目标文件前将给出确认提示,属交互式拷贝
-p
复制源文件内容后,还将把其修改时间和访问权限也复制到新文件中
-r
若源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。当然,目标文件必须为一个目录名
-l
不作拷贝,只是链接文件
-s
复制成符号连结文件 (symbolic link),亦即『快捷方式』档案
-u
若 destination 比 source 旧才更新 destination
rmdir
打包压缩
归档,也称为打包,指的是一个文件或目录的集合,而这个集合被存储在一个文件中。归档文件没有经过压缩,因此,它占用的空间是其中所有文件和目录的总和。 压缩是指利用算法将文件进行处理,已达到保留最大文件信息,而让文件体积变小的目的。
tar
-c (--create)
创建新的文档
-A
-f (--file)
打包
要生成的文件名
解包
要操作的文件名
查看
指定被查看文件
-v (--verbose)
显示详细的tar处理的文件信息
-x ( --extract, --get)
包文件解包
-r (--append)
增加文件,把要增加的文件追加在打包文件的末尾
-t (--list)
查看文件,查看文件中的文件内容
-C (--directory=DIR)
解压文件至指定的目录
-z (--gzip, --gunzip, --ungzip)
调用gzip程序来压缩文件,压缩后的文件名称以.gz结尾
-j (--bzip2)
调用程序bzip2实现压缩
实例
tar -cvf sysconfig.tar /etc/sysconfig
将目录/etc/sysconfig/目录下的文件打包成文件sysconfig.tar文件,并且放在当前目录中
tar -rvf sysconfig.tar /etc/sysconfig/
将目录/etc/sysconfig/目录下的文件追加到文件sysconfig.tar文件中去
tar -tvf sysconfig.tar
查看压缩文件sysconfig.tar文件里面的内容
tar -xvf sysconfig.tar
解压文件sysconfig.tar,将压缩文件sysconfig.tar文件解压到当前文件夹内
tar -czvf sysconfig.tar.gz /etc/sysconfig/
将目录/etc/sysconfig/打包成一个tar文件包,通过使用-z参数来调用gzip程序,对目录/etc/sysconfig/进行压缩, 压缩成文件sysconfig.tar.gz,并且将压缩成的文件放在当前文件夹内
tar -xzvf sysconfig.tar.gz
通过使用-z参数来调用gzip程序对sysconfig.tar.gz解压缩
tar -cjvf sysconfig.tar.bz2 /etc/sysconfig/
将/etc/sysconfig/目录打包成一个tar包,接着使用-j参数调用bzip2来进行压缩文件,对目录/etc/sysconfig/进行 压缩,压缩成文件sysconfig.tar.bz2并将其放在当前目录下
tar -xjvf sysconfig.tar.bz2
使用-j参数调用bzip2来进行解压文件
tar -N "2016/11/20" -czf hhh.tgz /tmp
比某个日期新的文件才打包
tar --exclude scf/service -zcvf scf.tar.gz scf/*
排除部分文件
tar -uf all.tar logo.gif
更新原来tar包all.tar中logo.gif文件
tar -rf all.tar *.gif
将所有.gif的文件增加到all.tar的包里面去
-u (--update)
仅将较新的文件附加到存档中
--remove-files
压缩后删除原文件
-P (--preserve-permissions, --same-permissions)
保留原文件属性,如权限
-p
保留绝对路径,即允许备份数据中含有根目录
-N
比某个日期新的文件才备份
--exclude
排除部分文件
zip
unzip
gzip
gunzip
bzip2
bunzip2
目录结构
/bin
存放系统命令,普通用户和 root 都可以执行。放在 /bin 下的命令在单用户模式下也可以执行
/boot
系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等
/dev
设备文件保存位置
/etc
配置文件保存位置。系统内所有采用默认安装方式(rpm 安装)的服务配置文件全部保存在此目录中,如用户信息、服务的启动脚本、常用服务的配置文件等
/home
普通用户的主目录(也称为家目录)。在创建用户时,每个用户要有一个默认登录和保存自己数据的位置,就是用户的主目录,所有普通用户的主目录是在 /home/ 下建立一个和用户名相同的目录。如用户 liming 的主目录就是 /home/liming
/lib
系统调用的函数库保存位置
/media
挂载目录。系统建议用来挂载媒体设备,如软盘和光盘
/mnt
挂载目录。早期 Linux 中只有这一个挂载目录,并没有细分。系统建议这个目录用来挂载额外的设备,如 U 盘、移动硬盘和其他操作系统的分区
/misc
挂载目录。系统建议用来挂载 NFS 服务的共享目录。虽然系统准备了三个默认挂载目录 /media/、/mnt/、/misc/,但是到底在哪个目录中挂载什么设备可以由管理员自己决定。例如,笔者在接触 Linux 的时候,默认挂载目录只有 /mnt/,所以养成了在 /mnt/ 下建立不同目录挂载不同设备的习惯,如 /mnt/cdrom/ 挂载光盘、/mnt/usb/ 挂载 U 盘,都是可以的
/opt
第三方安装的软件保存位置。这个目录是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录中。不过笔者还是习惯把软件放到 /usr/local/ 目录中,也就是说,/usr/local/ 目录也可以用来安装软件
/root
root 的主目录。普通用户主目录在 /home/ 下,root 主目录直接在“/”下
/sbin
保存与系统环境设置相关的命令,只有 root 可以使用这些命令进行系统环境设置,但也有些命令可以允许普通用户查看
/srv
服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据
/tmp
临时目录。系统存放临时文件的目录,在该目录下,所有用户都可以访问和写入。建议此目录中不能保存重要数据,最好每次开机都把该目录清空
/usr
/usr/share/
应用程序的资源文件保存位置,如帮助文档、说明文档和字体目录
/usr/src/
源码包保存位置。我们手工下载的源码包和内核源码包都可以保存到这里。建议放到/usr/local/src下
/usr/local/
手工安装的软件保存位置。我们一般建议源码包软件安装在这个位置
/var
用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等
/var/lib/
程序运行中需要调用或改变的数据保存位置。如 MySQL 的数据库保存在 /var/lib/mysql/ 目录中
/var/log/
登陆文件放置的目录,其中所包含比较重要的文件如 /var/log/messages, /var/log/wtmp 等
/var/run/
一些服务和程序运行后,它们的 PID(进程 ID)保存位置
/var/spool/
/var/www/
RPM 包安装的 Apache 的网页主目录
/var/tmp
一些应用程序在安装或执行时,需要在重启后使用的某些文件,此目录能将该类文件暂时存放起来,完成后再行删除
权限
定时任务(crontab)
配置文件
内容格式 分 小时 日 月 星期 [ 用户 ] 命令 0-59 0-23 1-31 1-12 0-6 [ user ] command (取值范围,0表示周日一般一行对应一个任务) 特殊符号的含义: “*”代表取值范围内的数字, “/”代表”每”, “-”代表从某个数字到某个数字, “,”分开几个离散的数字 实例 # 指定每小时的第5分钟执行一次ls命令 5 * * * * ls # 指定每天的 5:30 执行ls命令 30 5 * * * ls # 指定每月8号的7:30分执行ls命令 30 7 8 * * ls # 指定每年的6月8日5:30执行ls命令 30 5 8 6 * ls # 每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段] 30 3 10,20 * * ls # 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段] 25 8-11 * * * ls # 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ] */15 * * * * ls # 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls 命令。 ] 30 6 */10 * * ls # 每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件[ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ] 50 7 * * * root run-parts /etc/cron.daily
/etc/crontab
系统全局配置
/var/spool/cron/${user}
系统用户配置
/etc/cron.deny
该文件中所列的用户不允许使用Crontab命令
/etc/cron.allow
该文件中所列的用户允许使用Crontab命令
创建方式
修改/etc/crontab
修改/var/spool/cron
crontab -e命令
命令
crontab -e
打开任务文件并开始编辑,添加相应的任务,wq存盘退出
crontab -l
列出当前的所有调度任务
crontab -l -u jp
列出用户jp的所有调度任务
crontab -r
删除所有任务调度工作