Linux体系及其编程

文章目录

    • Shell
          • echo
          • 一般变量
          • 特殊的Shell变量
          • shell脚本
          • for语句
          • until语句
          • if语句
          • while语句
          • 函数
          • test命令
    • GCC
        • GCC编译流程
        • 简单示例
        • GDB
        • Make和Makefile
    • Vim
        • 注意
        • 基本命令
        • 命令图
    • 特殊字符
          • 管道符 `|`
          • 多命令执行符 `;`
    • 命令
          • apt
          • useradd [参数] 用户名
          • usermod [参数] 用户名
          • who
          • id
          • umask [-S] (权限掩码)
          • ls [参数] (正则表达式)
          • chmod [选项] [文件或目录]
          • which [命令]
          • export [参数]
          • fdisk [选项] [设备]
          • mkfs
          • mout [参数]
          • df [参数] [指定文件]
          • source [指定文件]
          • pwd
          • wc [选项] [文件]
          • eval
          • exec
          • stat
          • netstat
          • fflush
          • kill [参数]
    • 文件
          • /etc/passwd
          • /etc/profile
          • /etc/fstab
    • 额外
        • 禁止root用户
        • 进程
        • 环境变量
        • 忘记密码
        • 进程间通信
        • 文件系统

整理了一下学习Linux命令的笔记,特发此文。

在初学Linux时推荐两种方法:

  1. 去相关社区、在线查询网站学习交流,我推荐两个:

    Linux工具快速教程 — Linux Tools Quick Tutorial (linuxtools-rst.readthedocs.io)

    Linux命令大全(手册) – 真正好用的Linux命令在线查询网站 (linuxcool.com)

  2. 使用man 命令 查看帮助文档

Shell

echo

输出字符串或提取Shell变量的值

$变量 :提取变量的值

echo $PATH :提取PATH环境变量并输出

image-20220407160502862

$?:提取最近一次Shell命令的返回值(退出状态)

0表示没有错误,其它表示有错误

Linux体系及其编程_第1张图片

一般变量

Linux下变量无需声明,一般做字符串处理,数值计算时转化为数字

  • 创建或修改变量:变量名=变量值 (中间不能有空格)
  • 只读属性变量:readonly 变量名
  • 显式变量值:echo $变量名
  • 删除变量:unset 变量名
  • 导出变量名:export 变量名

Linux体系及其编程_第2张图片

特殊的Shell变量

$!:后台运行的最后一个进程的ID号

$@:与$*相同,但是使用时加引号,并在引号中返回每个参数,所有参数分解为包含若干个字符串的数组

$#:传递给脚本或者函数的参数个数

$$:执行本脚本程序的PID值

$*:所有参数组合成的一个字符串

$?:上一条语句的返回值

$0:脚本程序自身的名称( 命令行名称 )

$1$2$3:传给脚本或者函数的第一、二、三个参数

编写一个shell脚本:

#!/bin/bash
if [ $# -gt 1 ];
then
        echo "\$0程序名称:$0,\$1第一个参数是:$1"
        echo "\$2第二个参数是:$2,\$*所有参数组合的字符串:$*"
else
        echo "you need input beyond 2 pram"
fi
echo "\$$程序运行的PID值:$$"

分别用./specialshell.shsource specialshell.sh执行脚本,结果:

Linux体系及其编程_第3张图片

shell脚本

当前目录创建一个test.sh, 加入:

#!/bin/bash
for x in apple banna cake fruits
do
        echo "I love eat $x"
        sleep 1
done

执行 source test.sh

Linux体系及其编程_第4张图片

for语句
for var in list
do
     statements
done
until语句
until [expression]
do
	statements
done
if语句
if [expression];
then
	statements
elif [expression];
then
	statements
else
	statements
fi
while语句
while expression
do
	statements
done
函数
function 函数名()
{
	statements
}
test命令

用来做字符串比较、数值比较、文件测试、逻辑操作符。

字符串比较

符号 含义
= 比较两个字符串是否相等。如:test “1” = “2”
!= 比较两个字符串是否不等
-n 检查字符串长度是否大于0。如:test -n “”
-z 检查字符串长度是否等于0

数值比较

符号 含义
-eq 比较两个数值是否相等
-ge 比较前者是否大于等于后者
-le 比较后者是否大于等于前者
-ne 比较两个数值是否不等
-gt 比较前者是否大于后者
-lt 比较前者是否小于后者

文件测试

符号 含义
-d 检查是否是一个目录。如:test -d .inputrc
-f 检查是否是一个文件
-e 检查文件名或者目录名是否存在
-r 检查对此文件是否有"读"权限
-s 检查文件长度是否大于0
-w 检查对此文件是否有"写"权限
-x 检查对此文件是否有"执行"权限

逻辑操作

符号 含义
! 逻辑非(NOT)。如:test ! 1 -lt 2
-a 逻辑与(AND)。如:test 1 -lt 2 -a 2 -gt 3
-o 逻辑或(OR)。如:test 1 -lt 2 -o 2 -lt 3

GCC

GCC是流行的、多种语言的、自由的、跨平台的编译器

GCC编译流程

GCC将源代码便以为可执行程序的流程

  1. 预处理(Preproccessing)
  2. 编译(Compilation)
  3. 汇编(Assemble)
  4. 链接(Linking)

Linux体系及其编程_第5张图片

图片来源:GCC and Make - A Tutorial on how to compile, link and build C/C++ applications (ntu.edu.sg)

简单示例

gcc hello.c -o hello

这是一步到位的编译指令,过程经历 :预处理 —> 编译 —> 汇编 —> 链接

最后生成 hello 可执行文件

Linux体系及其编程_第6张图片

Linux体系及其编程_第7张图片

常用参数

  1. 缺省值:默认输出 a.out 可执行文件

  2. -v :查看GCC编译的详细信息

  3. -std :指定标准

  4. -o :指定输出文件的名称,缺省时输出 a.out 文件

  5. -Wall :输出所有警告信息

  6. -c :直将源文件编译为object文件(.o),而不进行链接,之后可用gcc -o 可执行文件名称 out1.o out2.o out3.o链接为可执行文件。

  7. -g :生成调试信息

  8. -O0 :不进行优化处理

  9. -O-O1 :进行优化处理

  10. -O2-O3 :-O2比O1更进一步优化,-O3比-O2更进一步优化

  11. -static :禁止共享链接

  12. -shared :编译为共享库(*.dll,.so)。

  13. -fPIC :产生与位置无关代码(Position-Independent Code)

  14. -E :编译为预处理文件(后缀名为 .i 的文件)

  15. -S :编译为汇编代码(后缀名为 .s 的文件)

  16. 更多查看官方:GCC online documentation - GNU Project

使用例子

# 静态链接
pi@raspberrypi:~ $ gcc -c mysum.c # 编译mysum.c生成 mysum.o文件
pi@raspberrypi:~ $ ar rcs libsum.a mysum.o # 为mysum.o创建静态链接库
# 从源文件生成动态链接库
pi@raspberrypi:~ $ gcc main.c libfunc.so -o a.out
# 动态链接
pi@raspberrypi:~ $ gcc -fPIC -shared func.c -o libfunc.so
# 从源文件生成动态链接库libfunc.so,-fPIC -c将.c源文件编译成.o文件,-shared将.o生成动态链接库.so文件
pi@raspberrypi:~ $ gcc main.c libfunc.so -o main
# 将 libfunc.so 链接到可执行文件。当 main 文件运行时,会动态地加载链接库 libfunc.so

参考:gcc 编译过程 - 超超酱 - 博客园 (cnblogs.com)

GDB

Make和Makefile

make 是一个程序,它按顺序读取 Makefile 和 makefile ,以自动选择执行编译链接。Makefile(makefile) 支持多线程并发操作make 命令只会编译我们修改过的文件,没有修改的文件不用重新编译。Makefile(makefile) 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令。

Makefile格式

Linux体系及其编程_第8张图片

目标项 依赖项列表
target: file1 file2 file3 … fileN
规则
command1
command2
other command
  • 目标项:欲生成的目标文件
  • 依赖项列表:生成目标项所需要的文件
  • 原理 :判断目标项是否存在,如果不存在或者与依赖项有不同的地方,则执行命令
  • 过程:如果没有在make命令中指定目标项,则从第一个目标项开始,递归地检查规则

一个简单的Makefile示例

# makefile
myt: type.h t.c mysum.c # target: 依赖项列表
	gcc -o myt t.c mysum.c # 规则:以  开头,后接要执行的命令

# Shell
pi@raspberrypi:~ $ make -f makefile  # makefile与自命名的makefile对应,若当前目录只有一个makefile只需要make即可

复杂点的Makefile

# 宏定义
CC = GCC  
CFLAGS = -Wall
OBJS = t.o mysum.o
INCLUDE = -Ipath

all: myt install

myt: t.o mysum.o
	$(CC) $(CFLAGS) -o myt $(OBJS) $(INCLUDE)

t.o: t.c type.h
	$(CC) -c t.c

mysum.o: mysum.c type.h
	gcc -c mysum.c

install: myt
	echo "install myt to /usr/local/bin"
	sudo mv myt /usr/local/bin/

run: install
	echo "run executable image myt"
	myt || /bin/true

clean:
	rm -f *.o 2> /dev/null
	sudo rm-f /usr/local/bin/myt

Vim

vi/vim有三种状态,分别是命令模式(Command Mode)、插入模式(Insert Mode)和底行模式(Last Line Mode),功能如:

  1. 命令模式

    控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入插入模式下,或者进入底行模式

  2. 插入模式

    文字输入文件,按「ESC」回到命令行模式

  3. 底行模式

    将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号…等

注意

  1. 当用vi/vim 打开文件时,首先处于 命令模式 ,需要按 「i」进入 插入模式 才能编辑文字。

基本命令

命令行模式

  • dd :删除光标所在行
  • u:回滚操作
  • ctrl+d:滚动当前页往下走
  • ctrl+u:滚动当前页往上走
  • nG:跳转到指定第n行,比如100G就是跳转到第100行
  • 0:移到当前行的开头
  • G:移动到文章的最后
  • fn+↑:滚动当前页往上走
  • fn+↓:滚动当前页往下走
  • fn+←:跑到当前行首
  • fn+→:跑到当前行尾

底行模式

  • :w :保存文件(加上 ! 为强制保存,:w!
  • :q :退出文件(加上 ! 为强制退出,:q!
  • :wq:强制保存退出文件
  • :set nu:显示行号
  • :set nonu:取消显示行号
  • :n:跳转到第n行,比如:15跳转到底15行
  • :/搜索内容:向前搜索内容,比如/hello,在当前文件里面搜索hello内容,默认跳转到第一个,按n键跳转到下一个
  • :?搜索内容 :向后搜索内容

命令图

Linux体系及其编程_第9张图片

特殊字符

管道符 |

管道的特点:

  1. 单向(前一个的输出是后一个的输入)
  2. 数据是FIFO的
  3. 大小限制为4K

管道分为 普通管道命名管道 两种:

  1. 普通管道

    供具有亲缘关系的进程间通信(没有名字,只有文件描述符)

  2. 命名管道

    对应磁盘上的文件,进程只要知道文件名就可以使用此管道。

在Shell中创建 命名管道

mknod 管道名 p
mkfifo -m 权限位 管道名

删除命名管道 :unlink

多命令执行符 ;
ls -la; echo "我是你爸"
set | wc -l; ls -la | grep bash

Linux体系及其编程_第10张图片

命令

apt

与apt相关的文件

文件位置 作用
/etc/apt/sources.list 设置软件包的获取来源
/etc/apt/apt.conf.d/ apt的各种配置文件
/var/chache/apt/archives/ 存放已经下载的软件包
/var/chache/apt/archves/partial 存放正在下载的软件包
/var/lib/apt/lists/ 存放已经下载的软件包的详细信息
/var/lib/apt/lists/partial/ 存放正在下载的软件包的详细信息

相关的子命令

子命令 作用
update 更新软件包列表
upgrade 更新系统中所有的软件包
install 安装软件包
remove 卸载软件包
autoremove 仅删除不需要再次下载的软件包
purge 彻底删除软件包(包括配置文件)
source 下载源代码
build-dep 自动下载安装编译某个软件说需要的软件包
dist-upgrade 升级整个发行版
clean 删除本地缓存中所有的升级包
autoclean 删除本地缓存中无用的软件包
check 检查是否存在有问题的依赖
useradd [参数] 用户名

新建一个用户

参数 作用
-D 改变新建用户的预设值
-c 添加备注文字
-d 新用户每次登录时所使用的家目录
-e 用户终止日期,格式为YYYY-MM-DD
-f 用户过期几日后永久停权。当值为0时用户立即被停权,而值为-1时则关闭此功能,预设值为-1
-g 指定用户对应的用户组
-G 定义此用户为多个不同组的成员
-m 用户目录不存在时自动创建
-M 不建立用户家目录,优先于/etc/login.defs文件设定
-n 取消建立以用户名称为名的群组
-r 建立系统账号
-u 指定用户id

仅仅只是用useradd 用户名这个命令不能创建一个可以登录使用的用户,/home目录下没有对应的用户,也创建不了密码。

需要用useradd -m 用户名创建一个可登录的,可以创建密码的用户。创建后可以在etc目录下的passwd添加这个新用户的相关信息。

添加新用户www:

[root@www ~]# useradd www

不创建家目录,并且禁止登陆:

[root@www ~]# useradd -M -s /sbin/nologin www

添加新用户www,指定UID为666,指定shell类型为/bin/bash,指定归属用户组为root,cool成员:

[root@www ~]# useradd -u 666 -s /bin/bash -G root,cool www

添加新用户www,设置家目录为/tmp/www,用户过期时间为2030/01/01.过期后两天停权:

[root@www ~]# useradd -e "2030/01/01" -f 2 -d /tmp/www www

此外,新增的用户不具有sudo权限,需要手动在/etc/sudoer增加新用户权限

选项 说明
user ALL=(ALL) ALL 允许用户user执行sudo命令(需要输入密码).
%user ALL=(ALL) ALL 允许用户组user里面的用户执行sudo命令(需要输入密码).
user ALL=(ALL) NOPASSWD: ALL 允许用户user执行sudo命令,并且在执行的时候不输入密码.
%user ALL=(ALL) NOPASSWD: ALL ALL=(ALL)允许用户组user里面的用户执行sudo命令,并且在执行的时候不输入密码.

Linux体系及其编程_第11张图片

更多信息查看文档 man useradd

usermod [参数] 用户名

改变用户的信息。其中参数选项的作用与 useradd 类似。

who

产看当前shell用户

image-20220417103032111

id

查看当前用户的身份以及权限

Linux体系及其编程_第12张图片

umask [-S] (权限掩码)

新建初始化文件的权限掩码

umask #获取当前权限掩码
umask -S #获取当前权限的可读权限信息
umask 0000 #修改新建初始化目录文件的权限

Linux体系及其编程_第13张图片

Linux体系及其编程_第14张图片

666& umask

新建初始化目录的权限

777& umask

ls [参数] (正则表达式)

文件的分类

普通文件 - , 目录文件 d , (软)链接文件 l , 字符设备文件 c , 块设备文件 b , 管道文件 p

目录不是目录,是一种目录文件

目录

  • r: 可以ls目录中的内容
  • w: 可以删除增加目录文件
  • x: 可以cd进入这个目录

文件

  • r:read 可读
  • w:write 可写
  • x:增删
  • r:可运行

ls -ld /etc : 查看目录拥有权限

image-20220407151622771

chmod [选项] [文件或目录]

赋予文件或目录权限

chmod u=wx etc :赋予etc目录 w:增删x:进入 的权限

chmod u-r etc :删去etc目录 r:可ls 的权限

其中还可以用三位十进制数表示不同权限

r :含义为 “可读”,用数字 4 表示
w:含义为 “可写”用数字 2 表示
x:含义为“可执行”用数字 1 表示
-:含义为“无权限”用数字0 表示

所有者 群组 其他 三位代表权限的数字
rwx rwx rwx 实际结果
421 421 421 777
421 401 401 705
chmod 777 a.out 
#777给auth.log文件赋予任何可读,可写,可执行权限
chmod 755 a.out
#755代表用户对该文件拥有读,写,执行的权限,同组和其它用户有读和执行权限,没有写权限
which [命令]

查看命令的安装路径

Linux体系及其编程_第15张图片

export [参数]

将shell变量/函数输出为环境变量

-p :列出所有shell赋予程序的环境变量

-n :删除指定变量

定义环境变量:# export MYENV

赋值:# export MYENV=1111

fdisk [选项] [设备]

操纵磁盘分区表

-l:列出所有分区表

mkfs

mkfs(make file system)用于在特定分区上建立文件系统(格式化)

  • -V :启用详细显示模式
  • -t:设定文件系统类型,默认为ext2
  • -c:检查分区时候有坏轨

在/dev/sda5 上建一个msdos的文件系统,同时检查是否有坏轨,并把详细过程列出

mkfs  -t  msdos  -c  -V  /dev/sda5
mout [参数]

挂载文件系统

挂载:是指由操作系统使一个 存储设备 (如硬盘、CD-ROM或共享资源)上的计算机文件或目录可供用户通过计算机的 文件系统 访问的一个过程。

引自——挂载_百度百科 (baidu.com)

当访问挂载点的时候,系统就知道要用哪些数据组织形式访问哪些类型的文件系统(或者说是哪些物理设备)。

作用:将一个具体存储设备上的具体文件系统和操作系统中对应的文件系统驱动(模块)关联起来,并将这个具体文件系统中的文件和目录关系挂载到全局目录树上,形成一个“激活运行状态”的文件系统。

引自——https://www.zhihu.com/answer/2437952746

将/dev/sdb1分区挂载到/wg目录上的命令:mount /dev/sdb1 /wg

umount实现文件系统的卸载

卸载/wg上的文件系统的命令:umount /wg

df [参数] [指定文件]

显示磁盘空间使用情况

Linux体系及其编程_第16张图片

-a :显示所有系统文件

-h :以易于human的阅读方式显示

-l :只显示本地文件

source [指定文件]

source命令通常用于执行刚修改的 初始化 文件,使之立即生效,不用注销重新登陆?

pwd

打印当前工作目录(print working directory)

wc [选项] [文件]

计算字数命令

选项 功能
-c或–bytes 只显示字节数
-l或–lines 显示行数
-w或–words 只显示字数

查看系统环境变量的字数信息:

sudo set | wc

只显示行数:

sudo set | wc -l

Linux体系及其编程_第17张图片

eval

执行多个命令,和 特殊命令 ;类似

Linux体系及其编程_第18张图片

exec

不创建子进程并执行后续命令;执行完毕后自动exit

Linux体系及其编程_第19张图片

stat
netstat

netstat -ant| grep 3306

image-20220407233817307

fflush
kill [参数]

文件

/etc/passwd

系统用户配置文件,存储了系统中所有用户的基本信息。

权限:所有用户可读

sudo vim /etc/passwd

Linux体系及其编程_第20张图片

名称 说明
用户名 已创建的用户名
加密口令 x代表加密密码保存在/etc/shadow文件中
用户ID 代表用户的ID号,每个用户都有一个唯一的ID
组ID 代表群组的ID好,每个群组都有一个唯一的ID
账号说明 描述用户的信息
主目录 代表用户所在的家目录
登录Shell 代表用户使用Shell的类型

Linux体系及其编程_第21张图片

/etc/profile

建立全系统通用的初始环境变量,每次用户登录时 第一个 被执行

/etc/fstab

系统启动时自动挂载。当系统启动时,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定内目录。

额外

禁止root用户

禁止root用户登录,并新建一个自己的用户

  1. 新建wyz用户(具体查看useradd)

  2. 赋予wyz 用户 sudo权限

  3. 禁止root登录

    $ sudo vim /etc/ssh/sshd_config

    PermitRootLogin yes更改为 no

    Linux体系及其编程_第22张图片

进程

可执行(二进制)程序被系统加载到内存空间运行时,就是 进程

每个进程都有唯一的标识号—— PID,进程可以产生新的进程,构成父子关系并形成进程树(pstree)。

Linux体系及其编程_第23张图片

进程都有一个 用户标识——对应运行此程序的用户ID。如果可执行文件没有设置suidsgid,则进程的 有效用户标识 为此用户,否则为文件的所有者。

每一个进程属于且仅属于一个 进程组,向进程组发送信号,则组内所有进程都能收到。

每个进程都属于一个唯一的 会话 。用户登录后产生一个会话,会话包含若干进程组。会话的id是首进程组的id。一个会话中只有一个进程组是前台进程组,和控制终端交互,获取输入,接收信号

控制终端关闭时,进程会收到 SIGHUP 信号。

除了PID为 0 的进程外,所有进程都有父进程。

进程优先级 = 优先级别(PR) + 谦让值(NI)。优先级别从父进程继承而来,不可更改,可以用 nice 将进程默认的谦让值从 0 改大(或改小)。

环境变量

全局的环境变量:存放在 /etc/profileLinux体系及其编程_第24张图片

特定用户的环境变量:存放在home目录的 .profile.bashrcLinux体系及其编程_第25张图片

临时的环境变量:export定义,特定于此会话

检查系统环境变量:

  • set,输出所有的变量,包括全局变量和局部变量
  • env,输出全局变量
  • declare,输出所有的变量,和set一样功能
  • export,显示和设置环境变量

忘记密码

进入单用户模式修改

进程间通信

六种方式:管道信号信号量共享内存消息队列Socket

  • 管道
  • 信号
  • 信号量
  • 共享内存
  • 消息队列
  • Socket

文件系统

虚拟文件系统

Linux体系及其编程_第26张图片

EXT2文件系统:引导块、超级块、iNode块、目录块、数据块

你可能感兴趣的:(linux,bash)