[date: 2018-10-09 21:53] [visits: 4]

Linux的知识备忘

最近在复习Linux的基础知识,这篇文章纪录一些我认为较有用的小知识点,相互之间没有必然联系。

目录

目录 说明
/ 根目录,万物起源
/bin 系统启动和运行所必须的二进制程序
/boot Linux内核和启动加载程序
/dev 设备结点的特殊目录
/etc 这个目录包含所有系统层面的配置文件
/home 在通常的配置环境下,系统会在/home下给每个用户分配一个目录
/lib 核心系统程序所需的库文件
/mnt 在早些的Linux系统中,/mnt目录包含可移除设备的挂载点
/proc Linux内核维护的虚拟文件系统,用于了解内核信息
/root root用户的家目录
/sbin “系统”二进制文件,通常为root用户保留
/tmp 临时目录,重启系统会清空该目录
/usr 普通用户所需要的所有程序和文件
/usr/bin 系统安装的可执行程序
/usr/lib 由/usr/bin目录中的程序所用的共享库
/usr/sbin 系统安装的管理程序
/usr/share 由/usr/bin目录中的程序使用的共享数据
/usr/share/doc /usr/bin目录中程序的一些文档
/var 可能需要改动的文件存储的地方,如数据库、日志、邮件等文件
/var/log 日志文件目录

命令

在shell中我们依靠输入命令执行所需程序,如果输入有误经常会看到command not found错误,那如何知道一个命令不存在呢?

在linux中,命令有以下四种类型:

与/bin、/sbin等目录中的文件一样,包括二进制可执行文件与脚本文件

内建于shell自身的命令,称为shell内部命令(builtins),例如cd、pwd、type等

小规模的shell脚本,它们混合到环境变量中,例如在.bashrc中定义的函数

定义自己的命令,建立在其它命令之上,通过alias定义

如果在shell中输入的命令与上述四种类型都不匹配的话,就会报command not found错误。平时我们可以使用type命令查看一个命令属于哪一种类型,比如type type输出'type is a shell builtin'。

字符展开

字符展开是对命令参数的一种解析行为,比如echo *这个命令并不会在标准输出上输出'*',而是输出所在目录的所有文件名,这就是一种字符展开行为。

字符展开主要包含以下几种:

前面讲到的echo *就属于路径名展开,*表示任意字符,所以echo *采用路径名展开的方式能够匹配当前目录下的所有文件,而echo A*则会输出当前目录所有A开头的文件名,除了*之外,还有一些其它匹配符号如:?、[characters]、[[:digit:]]等

~在shell中会被展开为用户的家目录,如root用户echo ~会输出/root,而cd ~在被展开后也就是cd /root

使用$((expression))的计算表达式的值,如echo $((1 + 1))会输出2

花括号展开更像是范围展开,如echo {1..10}会输出1到10的数字,而echo {a..z}会输出a到z的字母

参数展开也可称为变量展开,echo $1 x输出x,echo $USER输出当前用户名,因为$USER是一个环境变量,这个特性在Shell脚本中非常有用

一个命令的执行结果传递给另外一个命令,echo $(ls)输出当前目录下的文件名,除了$()形式外还可以使用符号`包裹命令:echo \ls``

字符展开非常有用,但在特殊场景下我们也许并不希望展开,这时可以使用双引号、单引号与转义字符的方式规避字符展开特性,举例如下:

echo "$USER" 
# 在双引号中,$、\与`依旧具有展开功能,所以这里会输出当前用户名

echo "~"
# ~失去展开功能,这里输出'~'

echo '$USER' 
# 禁止所有展开,输出'$USER'

echo \$USER
# 输出'$USER'

load average

使用top、uptime与w命令可以看到load average的三个数字,分别表示1分钟、5分钟与15分钟的单位时间内使用+等待CPU的进程数平均值,这个值接近CPU核数说明CPU利用比较充分,如果超出则表示CPU负载过高,系统处于忙碌状态,长时间处于忙碌状态系统有可能出现异常。

Shell提示符

每次输入命令的前面都展示有一部分展示信息,称为Shell提示符,默认内容格式与'[ ~]#'类似,其中包含了四个信息:用户名(root)、主机名(linux)、当前工作目录名(~)、身份(root)。

Shell提示符的格式可通过环境变量PS1设置,通过echo $PS1可以打印当前的所采用的格式,'[ ~]#'所对应的PS1为'[\u@\h \W]\$',其中\u、\h、\w与\$就是对应四个信息的变量表示。

我们可以通过修改PS1的值定制自己的Shell提示符,比如在自己的Shell提示符中显示当前工作目录的Git Branch:

# mac ~/.bash_profile

export PS1="[\h:\W\[\033[33m\]$(git_branch) \[\033[37m\]\A\[\033[00m\]]$"

# shell function
git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

效果:'[sha:amsimple(master) 10:24]\$ ',其中master就是目录amsimple中Git当前的Branch。

常用文本处理命令

cat 连接文件并且打印到标准输出
sort 文本行排序
uniq 报告或者省略重复行
cut 从每行中删除文本区域
paste 合并文件文本行
join 基于某个共享字段来联合两个文件的文本行
comm 逐行比较两个有序的文件
diff 逐行比较文件
patch 给原始文件打补丁
tr 翻译或删除字符
sed 用于筛选和转换文本的流编辑器