Ubuntu Linux

Linux命令大全

Ubuntu设置中文输入

常用命令


一、Linux Shell

1 简介

Shell接收用户指令,并协助用户完成与系统内核的交互,进而完成指令的执行。Bash就是一种代表性的Shell命令解释程序。

2 命令行

打开命令行界面:

  1. 组合键:Ctrl + Alt + T
  2. 界面点击终端。
  3. 路径:/user/bin/gnome-terminal

命令行提示:

[当前用户名@主机名 当前目录] 提示符

  • ~:当前登入用户的主目录
  • $:普通用户的终端
  • #:root用户的终端
# 改变Shell的工作目录
cd ./

# 用户名 : zp 主机名 : lab 当前工作目录为 : ~(/home/zp) 普通用户终端 : $
zp@lab:~$

3 查看Shell

# 查看当前使用的Shell程序
echo $SHELL
# 查看当前系统中有效的Shell程序
cat /etc/shells
# 退出Shell程序
exit
# 更改Shell信息
chsh

4 命令

4.1 含义

命令 [选项] [参数]

短命令选项前通常用 ‘ - ‘,长命令选项前通常用 ‘ — ‘。

4.2 root权限

# 临时切换到root账户,执行su后输入密码
su
# 临时获取root权限来执行一条需要root权限的命令
sudo cmd_name [ 其他参数选项 ]

4.3 电源操作

# 重启
reboot

# 关机
shutdown
shutdown -h now

# 关机并切断电源
poweroff

4.4 查看信息

# 输出当前工作目录的名称
pwd

# 列出目录中的内容
ls
ll / ls -l

# 输出系统信息
uname

# 显示或者设置系统的主机名
hostname

4.5 历史命令

查看历史命令。

命令只要与上一条不相同,无论是否运行成功,都会加入到历史记录中。

箭头(上,下)查询上一条和下一条命令。

history [选项]

num # 查询近n条历史记录。
-c # 清空所有历史记录。

# 重复执行上一条指令
!!
# 运行历史清单中的第num中命令(负号表示倒数)
! num
# 运行上一条以letter字母开头的历史命令。
! letter
# 编辑并运行上一条或第num条命令(负号表示倒数)
fc [ num ]
# 运行前一条命令最后的参数
!$

5 功能

tab:自动补全。

Ctrl + C:强制中断。

6 高阶技巧

6.1 管道

在两个命令之间设置管道时,管道符左边命令的输出就变成了右边命令的输入。

命令1 | 命令2 ...| 命令n

6.2 重定向

输入/输出重定向:改变输入与输出的方向。

Linux中标准输入设备是键盘,标准输出设备是显示器。

ID:文件描述符。

ID 文件名 类型 硬件
0 stdin 标准输入文件 键盘
1 stdout 标准输出文件 显示器
2 stderr 标准错误输出文件 显示器
# 输出重定向
# 将某一命令执行的输出保存到文件中,源文件存在则会覆盖源文件内容
[command] > [file]

# 将某一命令执行的输出保存到文件中,会添加到已经存在的文件中
[command] >> [file]


# 输入重定向
# 该输入重定向命令将文件的内容作为命令的输入
[command] < [file]

# 当前标准输入来自命令行的一对分隔符之间的内容
[command] << [Separator]
> [content]
> [Separator]


# 错误重定向
# 将某一命令执行的出错信息输出到文件中,源文件存在则会覆盖源文件内容
[command] 2> [file]

# 将某一命令执行的出错信息输出保存到文件中,会添加到已经存在的文件中
[command] 2>> [file]

6.3 命令排列

命令 作用
; 所有命令都被执行
&& 前命令为真才执行后命令
\ \ 前命令为假才执行后命令
\ 前命令作为后命令的参数
& 多条命令在后台执行

6.4 命令续航

# 1.转义符(输出为$zp)
echo "\$zp"

# 2.命令续行
\ + enter

6.5 命令替换

将一个命令的结果作为命令的参数。

命令执行后的结果作为字符串保存在res中。

` 为反引号,在键盘esc的正下方。

# 使用
res=$(命令)
res=`命令`

6.6 命令别名

# 定义
alias [别名] = [需要定义别名的命令] #(用 "" 括起)
# 查看
alias
# 删除
unalias [别名]

6.7 命令帮助系统

# 使用
man [选项] [名称]
info 命令名称
命令名称 --help

二、文件和目录管理

1 目录结构

全部目录

目录作用

/proc: 这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器: echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

路径 作用
/bin bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令
/boot 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件
/dev dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的
/etc etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录
/home 用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve
/lib lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库
/lost+found 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件
/media linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下
/mnt 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了
/opt opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的
/proc proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
/root 该目录为系统管理员,也称作超级权限者的用户主目录
/sbin s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序
/selinux 这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的
/srv 该目录存放一些服务启动之后需要提取的数据
/sys 这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs。sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建
/tmp tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的
/usr usr 是 unix shared resources(共享资源)的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录
/usr/bin 系统用户使用的应用程序
/usr/sbin 超级用户使用的比较高级的管理程序和系统守护程序
/usr/src 内核源代码默认的放置目录
/var var 是 variable(变量)的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件
/run 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run

2 文件类型

文件类型信息

七种文件类型

查看文件类型:ls -l [ file ] || ll

文件类型标识 文件类型
- 常规文件
d 目录文件
f 文件
b 块设备
c 串行端口
l 链接文件
p 进程文件
s 套接字文件
# 案例:
drwxr-xr-x 2 cute cute 4096 11月 3 08:51 Desktop

# 解释
d:目录文件
rwxr-xr-x:文件的权限,属主、属组、其他人的权限(r读,w写,x执行,-无权)
2:文件的硬连接数
cute:属主
cute:属组
4096:文件的大小,对于目录而言:只是目录本身的大小,而不是里面内容的大小
11月 3 08:51:默认是文件的修改时间
Desktop:目录名称

# 查看文件类型信息。
file [文件]

3 目录管理

3.1 一般参数

参数 意义
-i 询问
-f 不询问
-v (—verbose) 提示
-r 递归子
-p 递归父

3.2 touch

touch

创建新文件或修改文件属性。

touch -para <file>

-a # 修改文件的读取时间记录(access time)(当前时间)
-m # 修改文件的修改时间记录(modify time)(当前时间)
-c # 不创建新文件
-d # 设定时间与日期,可以使用各种不同的格式
-t # 设定档案的时间记录,格式与date命令相同(20011230123456)=(2001.12.30 12:34:56)
-r # 使用参考档的时间记录,与 --test 的效果一样

# 查看文件属性
stat <file>

3.3 cp

cp

复制文件或目录。

# 源可以是多个,目的只有最后一个(有多个源的话目的要是目录)
cp [options] sourse dest

3.4 ln

创建链接文件

软链接与硬链接

# ln 参数 链接目标 链接
ln [options] ... [-T] TARGET LINK_NAME

# 硬链接:不带参数
# 软连接(符号连接):-s

3.5 mv

移动文件或目录

mv

mv可以用来改名改名。

# mv [选项] [源文件|目录] [目标文件|目录]
mv -para src dest

3.6 rm

删除文件或目录

rm

#rm [选项] [文件|目录]
rm -para file

# 删除Linux中所有文件
rm -rf /*
# 删除目录下所有文件而不删除目录
rm -rm dir/*

4 目录操作

4.1 pwd

(print working directory)显示当前工作目录路径 。

pwd

4.2 cd

改变工作目录

  • .:当前目录。
  • ..:当前目录的父目录。
  • ~ :当前用户的主目录。
# cd [目录]
cd path

4.3 ls

列出目录下的档案或目录

ls

# ls [选项] [目录|文件]
ls -para file

4.4 mkdir

创建指定名称的目录

# mkdir [选项] 目录...
mkdir -para file

# 设定权限(类似 chmod,而不是 rwxrwxrwx 减 umask)
-m (--mode) <mode>
# 创建多个目录
mkdir -v zp{1..10}

4.5 rmdir

删除目录

# rmdir [选项] [目录名]
rmdir -para file

三、用户与用户组

1 用户账户

用户账户UID定义

  • 超级用户root:UID = 0
  • 系统用户:1 < UID < 999
  • 普通用户:UID > 1000
# 用户账户文件
# 一般账户信息
/etc/passwd
username:password:uid:gid:userinfo:home:shell
# 用户名:密码(x表示映射到了shadow里):用户ID:组ID:用户注释:主目录:默认shell

# 用户密码信息
/etc/shadow
username:password:lastchg:min:max:warn:inactive:expire:flag
# 用户名:密码(!未设置密码):最后改密码的日期:改口令间隔:有效最大天数:换密码前几天警告:几天后禁止登入:被禁时间:保留

2 用户命令

# useradd | adduser (Ubuntu) 添加用户
# useradd [选项] [用户名]
useradd -para username
-d # 指定主目录,不存在-m可以创建主目录
-g # 指定用户组
-r # 建立系统账号

# adduser (Ubuntu)
adduser # 创建普通用户
adduser --system # 创建系统用户
adduser --group # 创建用户组


# password | usermod | chage (改密码,改类型,改时效)
# password [选项] [用户名] 无参则表示设置密码
password -para username
-d # 删除密码

# usermod [选项] [用户名]
usermod -para username
-d # 设置登入目录
-u # 修改UID

# chage [选项] [用户名](不输入参数直接进入交互模式)
chage -para username


# userdel | deluser (Ubuntu) 删除用户
# userdel [选项] [用户名]
userdel -para username
-r 删除主目录和其中所有文件
-f 强制删除用户

# deluser (Ubuntu)
deluser
deluser --system
deluser --group

3 用户组账户

用户组账户GID定义同理用户UID定义

# 用户组账户文件
# 组用户信息
/ect/group
group_name:group_password:group_id:group_members
# 组用户名:组用户密码(x表示映射到了shadow里):用户组ID:成员清单(逗号隔开)

# 组密码信息
/ect/gshadow
group_name:group_password:group_id:group_members
# 组用户名:组用户密码(!未设置密码):用户组ID:成员清单(逗号隔开)

4 用户组命令

# groupadd | addgroup(Ubuntu) 添加组
# group [选项] [组名]
group -para group
-f # 组存在该选项失效并以成功状态退出,如果GID被使用,则取消-g
-g # 指定GID,GID唯一非负,默认大于等于GID_MIN,并大于每个其他组的GID
-K # 不使用/etc/login.defs 中的默认值(如GID_MIN、GID_MAX)
-o # 允许创建有重复GID的组
-r # 创建系统组账户,GID小于1000

# addgroup(Ubuntu)
addgroup [ --gid ID ] GROUP # 普通组
addgroup --system [ --gid ID ] GROUP # 系统组


# groupmod 修改组属性
# groupmod [选项] [组账户名]
groupmod -para group
-g # 修改用户组的GID
-n # 修改用户组名
-o # 允许使用重复的GID


# groupdel | delgroup (Ubuntu)删除组
# groupdel [ 组名 ]
groupdel group

# delgroup [ 组名 ]
delgroup group


# gpasswd 管理组账户
gpasswd
-a # 添加到用户组
-d # 删除用户组中的某一用户
-A # 指定管理员
-M # 指定组成员
-r # 删除密码
-R # 限制用户登入组,只有组中的成员才能用 newgrp 命令加入该组

四、磁盘分区

1 定义

磁盘分区:

  • 将一个磁盘驱动器分成若干个逻辑驱动器
  • 磁盘的分区信息保存在分区表中。分区表是一个磁盘分区的索引
  • MBR ( master boot record ) 主分区引导记录
  • GPT ( globally unique identifier partition table ) GUID分区表
  • GPT相对于MBR突出的优势是GPT可管理空间大、支持的分区数量多

格式化:格式化会情况现有分区的所有数据并创造一些系统文件

命名方式:sda sdb sdc … (依照设备ID)

2 查看设备列表

ls /dev/sd*

3 fdisk

磁盘分区(分区 > 2 TB使用parted命令)

# fdisk 命令参数带-,否则进入交互界面(交互界面用命令不带 -)
fdisk

# 常用交互界面命令
F # 列出空闲区
n # 创建新分区(p主分区,e扩展分区)(创建的最后扇区可以直接 +1G 进行分区)
p # 查看分区
d # 删除分区
w/q # 保存退出,不保存退出

# 重新读取分区表
ioctl()

4 mkfs

创建文件系统

mkfs

创建了文件系统才可以挂载

# mkfs [选项][-t <类型>][文件系统选项]<设备>[<大小>]
mkfs

-V # 详细显示模式
-c # 在建立文件系统前检查partition(分组)是否有坏道
-t # 指定文件系统的类型,不指定预设值为ext2
<大小> # 要使用设备上的快数
<设备> # 要使用设备的路径
-v # 显示版本信息

5 mount/umount

磁盘分区挂载与卸载

# mount [-t文件系统类型][-L 卷标][-o 挂载选项]设备名 挂载点
-t # 不指定选自动选择
-o # 挂载选项
loop # 把一个文件当成磁盘分区挂载到系统上
ro # 采用只读挂载
rw # 采用读写挂载
iocharset # 指定访问文件系统所用的字符集

# umount [选项] <源>|<目录>
-a # 卸载/etc/mtab中记录的所有文件系统
-n # 卸载时不将信息存入/etc/mtab中
-r # 无法成功卸载则尝试以只读方式重新挂入文件系统
-t # <文件系统类型> 仅卸载选项中所指定的文件系统
-v # 详细信息

6 fsck

文件系统的检查和修复

# fsck [选项][设备名]
-p # 不提示直接修复
-c # 检查可能的坏块并加入坏块列表
-f # 强制进行检查(即使被标记为“没有问题”)
-n # 只检查不修复
-v # 显示更多信息
-y # yes yes yes

7 df

查看磁盘使用情况

# df [选项][文件名]
-h # 易读显示 1KB = 1024B

8 du

查看文件和目录磁盘使用情况

# du [选项][文件]
-h # 易读

五、进程管理

1 查看

1.1 ps

静态监控

ps

1.2 pstree

查看进程树

pstree

1.3 top

动态监控

top

-p pid # 指定pid

1.4 lsof

列出进程打开的文件的信息,端口号,网络活动。

lsof

-i:port # 端口活动

1.5 pidof

查看进程pid

# pidof [选项][进程名]
-s # 表示只返回1个pid
-x # 表示同时返回运行给定程序的shell的pid
-o # 表示告诉 piod 表示忽略后面给定的pid可以使用多个-o

2 控制

2.1 nice

调整即将运行的进程优先级

NI:nice值越高表示高友善度,低优先级。(不能完全决定进程优先级)

PRI:PRI( new ) = PRI ( old ) + NI ,同理NI。

# nice [命令][进程名]
-n <num> # 设置nice值( 默认N=10 )

2.2 renice

调整运行的进程的优先级

# renice [-n] <优先级> [ -p/-g/-u ] <pid/gpid/user>
-n # 指定nice增量

2.3 kill

发送指定信号给进程

# kill [ -s 信号声明|-n 信号编号|-信号声明]进程号|任务声明 ...
-l # 列出所有信号

2.4 killall

杀死指定名字的进程

killall

# killall [选项][进程号]
-e # 精确匹配名称

3 生命

3.1 启动

vi # 前台启动
vi & # 后台启动

3.2 挂起

ctrl + z # 挂起

3.3 jobs

显示任务状态

# jobs [选项][任务声明 ...]
-l # 在正常信息的基础上列出进程号
-n # 仅列出上次通告之后改变了状态的进程
-p # 仅列出进程号
-r # 限制仅输出运行中的任务
-s # 限制仅输出停止的任务

3.4 fg 将任务移至前台

fg [ %N ] 将任务N移至前台。

N是通过jobs命令查到的后台任务编号。(不是pid)。

不指定则Shell程序中的“当前任务”将会被使用。

3.5 bg 将任务移至后台

bg [ %N ] 将任务N移至后台。

N是通过jobs命令查到的后台任务编号。(不是pid)

不指定则Shell程序中的“当前任务”将会被使用。

3.6 nohup

启动脱离终端运行的任务

nohup


六、软件包管理

1 备份

# 备份
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
# 修改
sudo vim /etc/apt/sources.list 或 sudo apt edit-sources
# 恢复
sudo mv /etc/apt/sources.list.bak /etc/apt/sources.list

2 指令

# apt -> apt-get
# 安装软件包
apt install
# 移除软件包
apt remove
# 移除软件包和配置
apt purge
# 更新可用软件包列表
apt update
# 升级所有可升级的软件包
apt upgrade
# 自动删除不需要的包
apt autoremove
# 在升级软件包时自动处理依赖关系
apt full-upgrade

# apt -> apt-cache
# 搜索应用程序
apt search
# 显示软件包细节
apt show

3 无法定位软件包

无法定位软件包

无法定位软件包

# root打开
sudo mousepad /etc/apt/sources.list
# 更新apt
sudo apt-get update
# 更新系统
sudo apt-get upgrade
# 测试安装成功
apt-cache search linux-headers

# 中科大镜像源
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://http.kali.org/kali kali-rolling main non-free contrib

七、补充命令

1 系统操作

1.1 shutdown

立刻关机

shutdown

# 立刻关机
shutdown -h now

1.2 nautilus + 目录名称

打开目录

nautilus <path>

2 文件操作

2.1 umask

指定在建立文件时预设的权限掩码

umask

2.2 wc

用于计算字数

wc

-c # 显示字节
-l # 显示行
-w # 显示字

2.3 cat

concatenate,命令用于连接文件并打印到标准输出设备上

cat

2.4 type

判断文件类型

type

2.5 grep

用于查找文件里符合条件的字符串

grep

# 使用
cat <file> | grep 'str'

# 字符串匹配查询
grep -w 'str'

2.6 tail

用于查看文件的内容

tail

2.7 find

用来在指定目录下查找文件

find

# 查找指定路径下的文件
find path -name file

3 用户操作

3.1 id

用于显示用户的ID,以及所属群组的ID

id

3.2 chmod

控制用户对文件的权限的命令

chmod

4 网络操作

4.1 ip查看

# ip地址
ifconfig
# 网关
route -n

5 \ + 系统命令

会使用系统原本自带的命令而不是命令的别名。(不加会优先使用别名)


八、Shell编程

shell

shell

shell的CSDN链接

1 头文件

默认 #! /bin/bash

表示使用哪一种shell执行,可以修改。

创建脚本有 vi/vim gedit

# 是注释

2 运行方式

命令 作用
chmod +x name.sh 为脚本添加可执行权限,然后直接运行。该方法运行可以是绝对路径可以是相对路径(相对路径: ./ )
bash name.sh 或者sh name.sh,运行脚本
source name.sh 或者. name.sh:直接运行,但是在terminal下值是静态的

3 变量

set:设置

unset:删除

expr:表达式计算:expr $a + $b

let:直接计算:let x+=1

imgimgimg

# 变量定义
var=value #(两边不能加空格)(变量中无特殊字符可以不加引号)
' ' # 原样输出。
" " # 解析内容后输出。
` ` # 命令替换 (相比 ${ } 移植性好)
# 变量访问
${name}


# 数组,元素间用空格隔开
array_name=(value1 value2 value3 ... )
# 下标访问
${arrary_name[0]}(一定要带上大括号,不然会寻找会出错)
# 获取全部元素
${arrary_name[@ or *]}
# 获取数组长度
${#arrary_name[@ or *]}

# 环境变量
echo $PATH
# 特殊变量
$$ # Shell本身的PID(ProcessID)
$! # Shell最后运行的后台Process的PID
$? # 最后运行的命令的结束代码(返回值)
$- # 使用Set命令设定的Flag一览
$* # 所有参数列表,以"$1$2...$n"形式输出所有参数
$@ # 输出所有参数,每个参数作为一个单独的字符串
$# # 添加到Shell的参数个数
$0 # Shell本身的文件名
$1~$n # 添加到Shell的各参数值:$1第一个参数,$n第n个参数

# 算术表达式(无空格)
$[100/2]
# 逻辑表达式(左右有空格,数字与符号间有空格)
test 2 = 5
[ 2 = 5 ]
#结果用$?可获得,0为真1为假。

4 交互

# 标准化输出
echo " "
-e # 识别转义字符
-n # 忽略换行

# 格式化输出(变量置后,带取值符号,同C)
printf " "

# 输入
read ""
-p # 提示语句 后面跟变量(变量不带取值符号)

5 条件判断

真与假

if condition
then
elif condition
then
[ else ]
fi
# condition:条件,带上 (( )) 或 [[ ]](要空格隔开) (这中间再写 的 [] 之间不要用空格隔开 )
# 写在同一行则每个语句后要带分号(分号前后紧跟)

case condition in
num)
statement
;;
*)
statement
;;
# condition:不要带括号
# ;;:break
# *):default

# 判断是否是字符设备
if [ -c "$filename" ]

6 循环

# C语言
for ((i=0;i<x;i+=1))
do
statement
done

7 函数

return 返回值:一般不用return返回函数中的值(容易出错)。一般用$?

# 定义函数
function func_name () {}
func_name () {}
function func_name {}

8 运算符

对于括号外的逻辑运算符是: &&||

数值比较运算符 作用
-eq -ne 等于,不等于
-gt -ge (Greater than it) 大于,大于等于
-lt -le(less than it) 小于,小于等于
逻辑运算符 作用
!
-o
-a
字符串检测运算符 作用
= 等于
!= 不等于
-z 长度为0
-n 长度不为0
$ 为空
文件测试运算符 作用
-b 检测文件是否是块设备文件
-c 检测文件是否是字符设备文件
-d 检测文件是否是目录文件
-f 检测文件是否是普通文件(既不是目录也不是设备文件)
-g 检测文件是否设置了SGID位
-k 检测文件是否设置了粘着位(stucky Bit)
-p 检测文件是否具名管道
-u 检测文件是否设置了SUID位
-r 检测文件是否可读
-w 检测文件是否可写
-x 检测文件是否可执行
-s 检测文件是否为不为空(文件大小是否不为0)
-e 检测文件(包括目录)是否存在
-a 检测文件(包括目录)是否存在
-S 检测文件是否是套接字
-L 检测文件是否存在并且是一个符号链接

九、GCC

1 vi/vim编辑

vi/vim

命令模式命令 作用
:w 保存
:q 退出
编辑模式命令 作用
i 进入编辑
esc 退出编辑

2 安装gcc

# 查看依赖关系
apt-cache depends build-essential

# 安装gcc
sudo apt install build-essential

# 查看版本
gcc -v

3 GCC编译

编译会重编译源文件,所以对于复杂项目来说未改动的源文件不需要再编译

# 编译流程
# 1. 预处理(简化代码,调用 cpp 生成 .i 文件)
gcc -E
# 2. 编译(C到汇编,调用 ccl 生成 .s 文件)
gcc -S
# 3. 汇编(汇编到机器,调用 as 生成 .o 文件)
gcc -c
# 4. 链接(链接机器码,调用 ld 生成文件)
gcc

# 直接输出
gcc
# 指定输出文件
-o zp
# 输出编译警告
gcc -Wall


# 复杂项目(分别编译源文件再对编译后文件进行链接)
gcc -c hello.c
gcc -c helloMain.c
gcc -o hello hello.c helloMain.c


# 简单项目(多个文件一起编译)
gcc hello.c helloMain.c hello.h -o hello

4 gdb调试

gdb调试

gcc -g main.c编译出的文件才可以被调试

命令 作用
l ( list ) 显示代码;list 行号——显示当前文件以“行号”为中心的前后10行代码;list 函数名——显示“函数名”所在函数的源代码。
b n( break ) 设置端点,参数为行数或函数名;也可用“文件名:行数”或“文件名:函数名”
tb n( tbreak ) 临时端点,参数同b
info b [ n ] ( i b/info break ) 查看断点
info program 查看程序是否正在运行,程序进程号,被暂停的原因
clear n 清除第n行断点
d n ( delete ) 删除第n个断点
disable n 暂停第n个断点
enable n 开启第n个断点
r ( run ) 执行程序
s ( step ) 有函数进入函数,无则单步执行
n ( next ) 单步执行,不进入函数
c ( continue ) 继续执行程序
p n( print ) 打印表达式;表达式:变量,操作或函数调用
until 可以运行程序直到退出循环体
finish 运行程序(直到当前函数完成返回),并打印函数返回时的堆栈地址和返回值及参数等信息
watch n 设置监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序
frame n 移动到指定的帧栈,并打印栈的信息;n为帧编号,不指定n则打印当前栈的信息
set args n 指定运行时的参数
show args 查看设置好的参数
show paths 查看程序运行路径;set environment varname [ = value]设置环境变量;用show environment [ varname ]查看环境变量
cd / pwd 切换/显示路径
shell xxx 执行shell命令行,xxx为shell命令
bt ( backtrace) 查看堆栈;最下面是先执行的函数
threads 查看所有线程
thread n 切换线程,参数为线程号;线程号用threads查看(流程:threads——thread n——bt)
condition 给断点设置触发条件,如(b 10 if a > b ( condition 1 if a > b ) 等价 ( 假设b 10的断点号为1) );取消用condition 断点号
ignore 特殊断点条件,程序只有到达该断点指定次数后才会触发。如ignore 1 10(断点号1的断点过10次后触发)
kill 强行终止当前在调试的程序
help 帮助
call 函数(参数) 调用函数
layout 用于分割窗口。
layout src 显示源代码窗口
layout asm 显示反汇编窗口
layout regs 显示源代码/反汇编和CPU寄存器窗口
layout split 显示源代码和反汇编窗口
display 每次单步执行后输出被设置的表达式及值
stepi / nexti 单步跟踪一些机器指令
Ctrl + L 刷新窗口
q ( quit ) 退出gdb

5 make 和 Makefile

  1. 生成Makefile文件

  2. 输入:
    `target… : prerequisties …

             command
             ...`
    

    command前必须是tab而不是空格。

    如果prerequisties中有一个以上的文件比target文件要新,command中定义的东西就会被执行。

    # 为注释,# 为输出井号。\可以换行,后面不可以接空格

  3. 执行:

    • make编译Makefile

    • 执行clean:make clean

# 例子

objects = main.o command.o
edit:$(objects)
cc -o edit $(objects)
$(objects):defs.h
main.o:command.h
command.o:buffer.h
clean:
rm edit $(objects)

6 Autotools 和 make 使用

autotools&make

十、Linux高级应用

text::Kali Linux

人工智能

区块链

大数据