跳转至

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. 如果父进程号不是1,直接kill -9 杀了父进程
  2. 如果父进程号是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功能被关闭的原因。
  1. 检查history功能是否关闭
## 显示on表示已启动
[root@centos7 ~]# set -o | grep history
history         on
## 如果显示off,编辑/etc/profile,添加如下命令
set -o history
  1. 检查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

13 系统级知识

13.1 namespace 的概念