Loading

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/ypNIS 服务机制所使用的目录,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结束。主要用途包括设置文本颜色、背景颜色、粗体、斜体、下划线等文本显示效果。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

👤本站访客数: 👁️本站访问量: