目录
1 基础符号
1.1 波浪号
~
字符在文件名中表示当前用户的主目录$HOME。如果是~/test
,就表示当前用户的$HOME目录下的test目录。而~NXL/test则表示用户NXL的宿主目录下的test目录。
1.2 正斜杠
/:根目录
./:当前目录
../:父级目录
../..:上两级目录
1.3 反斜杠
\:转义或续行
1.4 管道符
|:将上一条命令的输出,作为下一条命令的参数
2 文件系统
Linux文件系统结构遵循FHS标准。FHS(Filesystem Hierarchy Standard)即文件系统层次化标准,该标准规定了Linux系统中所有一级目录以及部分二级目录(/usr和/var)的用途。根据此标准用户可以清楚地了解每个目录应该存放什么类型的文件。
2.1 根目录
Linux系统的根目录以/
表示,其余所有的目录都是由根目录衍生出来的。根目录与系统的开机、修复、还原密切相关。
2.2 一级目录
/bin/ | 用于存放普通用户和 root 都可以执行的命令 |
/boot/ | 系统启动目录,用于存放与系统启动相关的文件 |
/dev/ | 用于保存设备文件 |
/etc/ | 用于保存配置文件 |
/home/ | 普通用户的根目录。所有普通用户的主目录是在 /home/ 下建立一个和用户名相同的目录。 如用户NXL的主目录就是/home/NXL,其用于保存每个用户的私有数据 |
/lib/ | 用于保存系统调用的函数库 |
/media/ | 挂载目录,系统用来挂载媒体设备的目录,如软盘/光盘 |
/mnt/ | 挂载目录,系统用来挂载额外设备的目录,如 U 盘、移动硬盘和其他操作系统的分区 |
/misc/ | 挂载目录,系统用来挂载 NFS 服务的共享目录 |
/opt/ | 第三方软件的安装保存位置 |
/root/ | root的主目录 |
/sbin/ | 用于保存与系统环境设置相关的命令,只有 root 可以使用这些命令进行系统环境设置, 但有些命令可以允许普通用户查看 |
/srv/ | 服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据 |
/tmp/ | 系统存放临时文件的目录,在该目录下,所有用户都可以访问和写入 |
/proc/ | 虚拟文件系统。该目录中的数据并不保存在硬盘上,而是保存到内存中。 主要保存系统的内核、进程、外部设备状态和网络状态等。 |
/sys/ | 虚拟文件系统。和 /proc/ 目录相似,该目录中的数据都保存在内存中,主要保存与内核相关的信息 |
/usr/ | 全称为 Unix Software Resource,此目录用于存储系统软件资源 |
/var/ | 用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等 |
2.3 二级目录
2.3.1 /usr
/usr/bin/ | 存放普通用户和超级用户都可以执行的系统命令。这些命令和系统启动无关。 |
/usr/sbin/ | 存放根文件系统不必要的系统管理命令,如多数服务程序,只有 root 可以使用。 |
/usr/lib/ | 应用程序调用的函数库保存位置 |
/usr/XllR6/ | 图形界面系统保存位置 |
/usr/local/ | 手工安装的软件保存位置。一般建议将源码包软件安装在这个位置 |
/usr/share/ | 应用程序的资源文件保存位置,如帮助文档、说明文档和字体目录 |
/usr/src/ | 源码包保存位置。我们手工下载的源码包和内核源码包都可以保存到这里 |
/usr/include/ | C/C++ 等编程语言头文件的放置目录 |
2.3.2 /var
/var/lib/ | 程序运行中需要调用或改变的数据保存位置 |
/var/log/ | 登陆文件放置的目录 |
/var/run/ | 一些服务和程序运行后,它们的 PID(进程 ID)保存位置 |
/var/spool/ | 里面主要都是一些临时存放,随时会被用户所调用的数据 |
/var/nis和/var/yp | NIS 服务机制所使用的目录,nis 主要记录所有网络中每一个 client 的连接信息; yp 是 linux 的 nis 服务的日志文件存放的目录 |
/var/tmp | 保存一些应用程序在安装或执行时,需要在重启后使用的某些文件 |
3 常用命令
ar:用于建立或修改备存文件,或是从备存文件中抽取文件。其可以集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。一般常用其生成.a静态库文件。
# 打包以.c结尾的文件 ar -rv NXL.bak *.c
echo:用于写内容到标准输出。
# 在命令行中输出hello world echo "hello world!" # 在命令行中输出当前日期 echo `date` # 打印系统PATH环境变量/当前用户主目录 echo $PATH / echo $HOME # 利用-e参数控制输出内容的属性 echo -e "\033[31mtest\033[0m" // 控制输出的内容为红色 echo -e "\033[41;31mtest\033[0m" // 控制输出的内容背景为红色 其中:\033[31m 和 \033[0m 就是 ANSI控制码,利用 ANSI控制码 就可以控制输出内容的相关属性 常用ANSI控制码总结如下: \033[0m :关闭所有属性 \033[1m :设置高亮度 \033[4m :下划线 \033[5m :闪烁 \033[7m :反显 \033[8m :消隐 \033[30m -- \033[37m :设置字符颜色 \033[40m -- \033[47m :设置背景色
touch:用于修改文件或者目录的时间属性,包括`atime`、`mtime`和`ctime`,若文件不存在,系统则会建立一个新的文件。
每个文件在Linux下面都会记录3个主要的修改时间:
- atime:access time,文件最近访问时间
- mtime:modification time,文件内容最近修改时间
- ctime:change time,文件权限属性最近修改时间
ls命令默认情况下显示的是mtime。
stat:用于查看文件状态
# 查看当前目录所有文件的状态 stat * # 查看 main.c 文件状态 stat main.c
mkdir:用于创建目录
# 在工作目录下建立一个名为 output 的子目录 mkdir output # 在工作目录下的 output 目录中建立一个名为 test 的子目录(output目录已经存在) mkdir ./output/test # 在工作目录下的 output1 目录中建立一个名为 test 的子目录(output1目录不存在) mkdir -p ./output1/test # -p 参数用于确保目录存在,不存在就新建一个
rm:用于删除一个文件或者目录。
参数:
- -i:删除前逐一询问确认
- -f:即使原档案属性设为只读,亦直接删除,无需逐一确认
- -r:将目录及以下之档案亦逐一删除
# 删除文件 test.txt rm test.txt # 删除目录 output rm -r output # 删除当前目录下的所有文件及目录 rm -r * # 文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令
set:用于设置所使用的shell的执行方式
# 设置若指令传回值不等于0,则立即退出shell set -e
sed:用于利用脚本指令来处理、编辑文本文件。
sed采用流编辑模式,在处理数据之前,需要预先提供一组规则,sed会按照此规则来编辑数据。此规则一般称之为脚本命令。此命令执行顺序:每次仅读取一行内容;根据提供的规则命令匹配并修改数据;将执行结果输出。当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。
sed [选项] [脚本命令] 文件名
ls:用于显示指定工作目录下的内容
dirname:从文件路径中获取文件目录
如果文件路径中不包含/
,那么输出.
表示当前目录。如果文件路径最后一个字符是/
,那么剥离倒数第二个/
及其后的内容。
basename:从文件路径中获取文件基本名称
eval:将 eval 后面的 <参数> 组合成一个字符串并且视为shell命令执行
find:用于在指定目录下查找指定文件(默认目录就是当前目录)
realpath:用于获取指定目录或文件的绝对路径
cp:用于复制文件或目录
tree:用于以树状图形式列出目录的内容
getopt:Linux系统上的标准库函数, 用于处理命令行参数
su:用于切换为另一个用户或超级用户(superuser)。su 是 “Switch User” 的缩写。
useradd:用于在 Linux 系统中创建新用户
passwd:为新用户设置密码,以允许该用户登录系统
ldd:用于显示一个可执行文件或共享库所依赖的动态链接库。它的用法是在终端中输入 ldd 后跟要检查的可执行文件或共享库的路径
ldd /data/P145/e02-android9/prebuilts/clang/host/linux-x86/clang-4691093/bin/clang.real
4 常用工具
4.1 screenfetch/neofetch
展示当前系统的系统信息和 ASCII 艺术
5 软件调试
5.1 core文件调试
在Linux系统进行软件开发/调试时,经常会出现程序core dump的情况,为了分析程序崩溃原因,可以通过以下设置,使得程序在崩溃时自动生成一个core文件,该文件会记录一些程序崩溃信息。
5.1.1 开启核心转储
# 用vscode打开 /etc/bash.bashrc(以root权限打开) sudo code --no-sandbox --user-data-dir=/etc /etc/bash.bashrc # 最后行添加 ulimit -c unlimited # modify core dump file size limit # note:若要关闭核心转储功能, 只需要调整限制大小即可: ulimit -c 0
5.1.2 设置core文件存储路径
# 查看core文件生成路径 cat /proc/sys/kernel/core_pattern # 设置core文件生成路径为当前程序执行目录下(需要root权限) echo "core-%e" > /proc/sys/kernel/core_pattern
5.1.3 使用gdb分析core文件
# 语法: gdb <应用程序名称> <核心转储文件名称>
5.2 墓碑文件调试
当软件在安卓环境运行异常崩溃后,在/data/tombstones
文件夹下会出现对应的墓碑文件,通过墓碑文件,可以定位程序是由于执行哪一行代码崩溃的,这可以为定位程序异常死机问题提供一定的帮助。

# 通过以上墓碑文件及以下步骤,可以获得程序崩溃前的最后执行情况 readelf -n libota_common.so # 若libota_common.so的BuildId与backtrace中的BuildId一致,则可以利用addr2line # addr2line 是 GNU 工具链中的一个命令,用于将程序的地址转换为文件名和行号 # addr2line -e <可执行文件> <地址> addr2line -e libota_common.so -f -i 0000000000099d40
6 shell配置
在linux系统中,一个终端可以选择不同的shell,每个shell都有自己的配置文件。
6.1 bash
bash的配置文件位于~/.bashrc
,以下是我自己的常用配置:
# # ~/.bashrc # # If not running interactively, don't do anything [[ $- != *i* ]] && return # Some shortcuts alias ls='ls -hF --color=tty' # classify files in colour alias dir='ls --color=auto --format=vertical' alias vdir='ls --color=auto --format=long' alias ll='ls -l' # long list alias la='ls -A' # all but . and .. alias l='ls -CF' # alias grep='grep --color=auto' # 加载 Git 命令的自动补全功能脚本 source /usr/share/git/completion/git-prompt.sh source /usr/share/git/completion/git-completion.bash # add vscode environment variable (windwos style) # export PATH="/c/Program Files/Microsoft VS Code/bin:$PATH" # add cmake environment variable (linux style) # export PATH="/usr/local/cmake/bin:$PATH" # 设置命令提示符(Command Prompt Symbol)格式 PS1="" # PS1="$PS1"'\[\033[32m\]\u' # change to green PS1="$PS1"'\[\033[01;32m\]\u' # change to green(Bold) PS1="$PS1"'\[\033[37m\]@' # change to white PS1="$PS1"'\[\033[34m\]\h' # change to blue PS1="$PS1"'\[\033[37m\]:' # change to white # PS1="$PS1"'\[\033[35m\] UCRT64 ' # change to purple PS1="$PS1"'\[\033[33m\]\w' # change to yellow PS1="$PS1"'\[\033[36m\]`__git_ps1`' # change to cyan PS1="$PS1"'\[\033[00m\]' # reset PS1="$PS1"'\n' # new line PS1="$PS1"'$ ' # prompt always with $
7 ANSI转义码
ANSI转义码是一种用于在终端(如命令行界面)中控制文本格式和颜色的特殊字符序列。它们以\033[
开头,后面紧跟控制字符和参数,并以字母m
结束。主要用途包括设置文本颜色、背景颜色、粗体、斜体、下划线等文本显示效果。