Linux常识¶
1 linux快捷操作¶
Ctrl + r
:逆向搜索命令历史Ctrl + g
:取消搜索Esc
:只显示匹配的命令到命令行,但不执行Enter
:执行匹配的命令Ctrl + z
:挂起命令(通常用于vim编辑文件,临时退出编辑)fg
:在命令行输入fg
并执行,将返回被挂起的任务Ctrl + u
:删除光标到开头的字符(在命令行下)Ctrl + k
:删除光标到末尾的字符(在命令行下)Esc + .
:获得上一条命令中的参数,比如上一条命名是ls /home
,获得的参数就是/home
- Bang (!) 命令
!!
:执行上一条命令!blah
:执行最近的以 blah 开头的命令,如 !ls!blah:p
:仅打印输出,而不执行!$
:上一条命令的最后一个参数,与 Alt + . 相同!$:p
:打印输出 !$ 的内容!*
:上一条命令的所有参数!*:p
:打印输出 !* 的内容^blah
:删除上一条命令中的 blah^blah^foo
:将上一条命令中的 blah 替换为 foo^blah^foo^
:将上一条命令中所有的 blah 都替换为 foo
2 重要的环境变量¶
HOME
:当前用户主目录PATH
:定义可执行程序或脚本所在路径SHELL
:用户使用的 Shell 解释器名称,如/bin/bash
$PS1
: 命令行提示符
3 设置locale¶
使用locale -a
命令,获取可以使用的locale。
- 当前命令行生效:在命令行执行export LANG="zh_CN.utf8"
。(注意:其中zh_CN.utf8
只是其中一种locale)
- 单个用户生效:在用户环境变量配置文件,如~/.bash_profile
文件里面写入export LANG="zh_CN.utf8"
- 所有用户生效:在系统环境变量配置文件,如/etc/profile
文件里面写入export LANG="zh_CN.utf8"
4 目录的硬链接数为什么不是1?¶
- 计算公式:$$目录链接总数=1+子目录数$$
title: info 目录的硬链接数为什么不是1?
因为在目录下存在隐藏文件. 和..,.是硬链接指向当前目录,所以当前目录硬链接数变为2;如果含子目录,而父目录因为子目录的..和父目录自己的.,所以父目录硬链接数是3。(使用`ls -l`查看目录硬链接数)
5 ls -l 目录大小¶
- https://www.pianshen.com/article/45281509680/
- https://www.jianshu.com/p/1c22dcb17a2e
6 文件防误删¶
6.1 方法一: ln 硬链接备份¶
- 示例
ln src dest.link
6.2 方法二: chattr 禁止删除¶
注意:需要 root 权限 - 示例
chattr +i file
7 僵死进程怎么kill¶
- 如果父进程号不是1,直接kill -9 杀了父进程
- 如果父进程号是1,只能重启机器
8 查询core文件由哪个程序产生¶
- 通过file查询
- 示例
$ file core.657636
core.657636: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '/home/here4/.vscode-server/extensions/ms-vscode.cpptools-1.6.0/bin/cpptools'
9 Linux环境变量¶
9.1 环境变量文件加载顺序¶
9.2 PATH¶
PATH环境变量冒号:
作用是作为分割符,如PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin
。
注意:但这并不意味着其它环境变量也是以冒号:来作为分隔符,其它也可以有分号;等等来作为分隔符,只要使用它的能按规则正确解析即可
9.2.1 关于环境变量的指令¶
env
:显示当前系统环境变量export
:导入环境变量(临时,只对当前shell有效)set
:显示shell变量unset
:清除环境变量
9.2.2 环境变量文件/etc/profile和~/.profile¶
- 系统环境变量文件
/etc/profile
- 用户环境变量文件
~/.profile
读取设置环境变量方式: 1. 首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如/etc/profile.d和/etc/inputrc 2. 然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_login,这个也读取不了才会读取~/.profile,这三个文档设定基本上是一样的, 读取有优先关系. 3. 然后在根据用户帐号读取~/.bashrc
9.2.3 系统变量文件/etc/profile¶
/etc/profile
文件中导出了PATH变量
$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin"
fi
export PATH
if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
tty | egrep -q tty[1-6] && export LC_ALL=C
- 但这个文件也可以导出其它变量,如下例导出自定义变量
HELLO
shuhaiwen@shuhaiwen:/etc$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin"
fi
export PATH
export HELLO=hello world
# 省略下面部分
...
- 要使新增加的变量生效,使用source命令
$ source /etc/profile
$ echo $HELLO
hello
9.2.4 用户变量文件~/.profile与~/.bashrc¶
~/.profile可以设定本用户专有的路径,环境变量,等,它只能登入的时候执行一次. ~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次。
用户变量文件只对当前用户有效,使用和系统变量文件/etc/profile一样。设置后依然需要用source
命令进行更新
9.3 export临时导入环境变量¶
使用export向PATH中导入变量hello
$ export PATH=hello:$PATH
$ echo $PATH
hello:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin
但这只对当前shell有效,打开另一个bash,再次打印PATH,hello不存在了
~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin
9.4 LD_LIBRARY_PATH¶
LD_LIBRARY_PATH
是程序加载动态链接库(.so)文件查找的路径。如果你的程序需要加载非默认加载路径的.so文件时,你必须要将其路径通过LD_LIBRARY_PATH
导出否则程序会报找不到库错误
10 如何多个进程监控同一个端口号¶
注意:linux下是以协议、ip、端口来绑定端口的。 1. 使用不同的网络协议(如TCP、UDP),则ip地址、端口号可以相同 2. 在Linux Kernel 3.9版本之后,通过SO_REUSEPORT选项,则可以有相同协议、ip、端口号 3. 在多网卡下,不同网卡对应不同的ip地址,可以使用不同的ip地址绑定相同的端口号
11 磁盘分区和逻辑卷¶
12 history历史命令¶
title: 有的linux环境上只能查询几条历史记录,有的可以查询到上百条,这时为什么呢?
原因是系统设置的HISTFILESIZE、HISTSIZE过小,或者history功能被关闭的原因。
- 检查history功能是否关闭
## 显示on表示已启动
[root@centos7 ~]# set -o | grep history
history on
## 如果显示off,编辑/etc/profile,添加如下命令
set -o history
- 检查HISTFILE 、HISTSIZE、HISTFILESIZE变量值
# 如下检测显示一切正常
[root@centos7 ~]# echo $HISTFILE
/root/.bash_history
[root@centos7 ~]# echo $HISTSIZE
1000
[root@centos7 ~]# echo $HISTFILESIZE
1000
- 如果HISTFILE显示空,则编辑
/etc/profile
文件,在末尾加入HISTFILE=$HOME/.bash_history
- 如果HISTSIZE过小,则编辑
/etc/profile
文件,在末尾加入HISTSIZE=1000
,数值任意,最大支持1000,表示缓存命令数量 - 如果HISTFILESIZE过小,则编辑
/etc/profile
文件,在末尾加入HISTFILESIZE=1000
,数值任意,最大支持1000,表示缓存文件最大支持保存的命令数量 - 修改后加载环境变量
source ~/.bash_profile