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函数
小规模的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)、主机名(linux)、当前工作目录名(~)、身份(root)。
Shell提示符的格式可通过环境变量PS1
设置,通过echo $PS1
可以打印当前的所采用的格式,'[root@linux ~]#'所对应的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|用于筛选和转换文本的流编辑器|