Linux基础——1

一、Linux系统

嵌入式系统 嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统

Linux操作系统的组件 Linux内核 Shell 文件系统 实用程序

Linux内核

​ Linux内核支持多用户、多任务模式运行 ​ 多用户:同时有多个用户访问系统 ​ 多任务:某个时刻有多个程序运行

Shell是一个命令行解释器,它使得用户能够与操作系统进行交互。 Shell类型 Bourne Shell: 最早的Shell C Shell Ksh Z Shell …

Ubuntu有两种类型的软件包:二进制软件包(deb)和源码包(deb-src)。 二进制软件包(Binary Packages):它包含可执行文件、库文件、配置文件、man/info页面、版权声明和其它文档。 源码包(Source Packages):包含软件源代码、版本修改说明、构建指令以及编译工具等。先由tar工具归档为.tar.gz文件,然后再打包成.dsc文件

APT

APT(Advanced Packaging Tool)是Ubuntu Linux***能最强大的命令行软件包管理工具,用于获取、安装、编译、卸载和查询Deb软件包,以及检查软件包依赖关系。 
Ubuntu采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源(reposity)。 

APT并不是某个具体的命令,应该说是一组命令,以下列举几个常用的APT命令。
apt-get:用于管理软件包,包括安装、卸载、升级等操作;
apt-cache:用于查询软件包信息;
apt-proxy:用于搭建APT代理服务器;
apt-show-versions:用于显示系统中软件包版本信息;
apt-config:用于读取APT配置文件的简单工具;
apt-cdrom:用于将CD-ROM加入软件源配置文件。

在Ubuntu Linux中,通常使用apt-get命令管理软件包,只需告知软件包名字,就可以自动完成软件包的获取、安装、编译和卸载,以及检查软件包依赖关系。 
apt-get命令本身并不具有管理软件包功能,只是提供了一个软件包管理的命令行平台。在这个平台上使用更丰富的子命令,完成具体的管理任务。 

apt-get  subcommands  [ -d | -f | -m | -q | --purge | --reinstall | - b | - s | - y | - u | - h | -v ]  pkg

子命令 描述
update 下载更新软件包列表信息
upgrade 将系统中所有软件包升级到最新的版本
install 下载所需软件包并进行安装配置
remove 卸载软件包
autoremove 将不满足依赖关系的软件包自动卸载
source 下载源码包
build-dep 为源码包构建所需的编译环境
dist-upgrade 发布版升级
dselect-upgrade 根据dselect的选择来进行软件包升级
clean 删除缓存区中所有已下载的包文件
autoclean 删除缓存区中老版本的已下载的包文件
check 检查系统中依赖关系的完整性
选项 描述
-d 仅下载软件包,而不安装或解压
-f 修复系统中存在的软件包依赖性问题
-m 当发现缺少关联软件包时,仍试图继续执行
-q 将输出作为日志保留,不获取命令执行进度
--purge 与remove子命令一起使用,完全卸载软件包
--reinstall 与install子命令一起使用,重新安装软件包
-b 在下载完源码包后,编译生成相应的软件包
-s 不做实际操作,只是模拟命令执行结果
-y 对所有询问都作肯定的回答,apt-get不再进行任何提示
-u 获取已升级的软件包列表
-h 获取帮助信息
-v 获取apt-get版本号
使用“apt-get install”下载软件包大体分为四步:
STEP1,扫描本地存放的软件包更新列表(由apt-get update命令刷新更新列表),找到最新版本的软件包;
STEP2,进行软件包依赖关系检查,找到支持该软件正常运行的所有软件包;
STEP3,从软件源所指的镜像站点中,下载相关软件包;
STEP4 ,解压软件包,并自动完成应用程序的安装和配置。 

二、Shell命令

随着各式Linux系统的图形化程度的不断提高,用户在桌面环境下,通过点击、拖拽等操作就可以完成大部分的工作。
然而,许多Ubuntu Linux功能使用Shell命令来实现,要比使用图形界面交互,完成的更快、更直接。 


英文单词Shell可直译为“贝壳”。“贝壳”是动物作为外在保护的一种工具。
可以这样认为,Linux中的Shell就是Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互 


命令是用户向系统内核发出控制请求,与之交互的文本流。
Shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互。
同时,Shell为操作系统提供了内核之上的功能,直接用来管理和运行系统。
当需要重复执行若干命令,可以将这些命令集合起来,加入一定的控制语句,编辑成为Shell脚本文件,交给Shell批量执行。 

shell命令执行过程:
    用户在命令行提示符下键入命令文本,开始与Shell进行交互。
    接着,Shell将用户的命令或按键转化成内核所能够理解的指令
    控制操作系统做出响应,直到控制相关硬件设备。
    然后,Shell将输出结果通过Shell提交给用户。 

shell命令
	立即关机与重启
	1、shutdown
        sudo  shutdown  -h  now
    eg:45分钟后关机
    	shutdown  -h  +45	
        
        sudo  shutdown  -r  now
    eg:60分钟后重启
    	sudo  shutdown  -r  +60
   	重启:
        reboot   now

命令行提示符

alt

username:用户名,显示当前登录用户的账户名;
hostname:主机名,显示登录的主机名,例如若远程登录后,则显示登录的主机名;
direction:目录名,显示当前所处的路径,当在根目录下显示为“/”,当在用户主目录下显示为“~”;
例如当前Shell提示符为“wdl@UbuntuFisher:~/Examples$”,用户名为“wdl”,主机名为“UbuntuFisher”,目录名为“~/Examples”,即用户主目录下的/Examples目录。

命令格式

alt

$:Shell提示符,如果当前用户为超级用户,提示符为“#”,其他用户的提示符均为“$”;
Command:命令名称,Shell命令或程序,严格区分大小写,例如设置日期指令为date等;
Options:命令选项,用于改变命令执行动作的类型,由“-”引导,可以同时带有多个选项;
Argument:命令参数,指出命令作用的对象或目标,有的命令允许带多个参数。

不带选项和参数
例如ls命令未带任何参数,列出当前目录中的所有文件,只显示文件名称。
命令不带选项或参数,通常意为使用默认选项或参数。
一条命令的三要素之间用空格隔开;
若将多个命令在一行书写,用分号(;)将各命令隔开;
如果一条命令不能在一行写完,在行尾使用反斜杠(\)标明该条命令未结束。
补齐命令与文件名
	在使用Shell命令时,很多用户会经常遇到命令或文件名没有记全的情况。Bash Shell的命令和文件名补齐功能会帮助用户。在输入命令或文件名的前几个字符后,按TAB键或ESC键自动补齐剩余没有输入的字符串。如果存在多个命令或文件有相同前缀,Shell将列出所有相同前缀的命令或文件。Shell给出的提示信息,帮助用户回忆和完成输入。之后等待用户输入足够的字符。
	需要说明的是,连续按两下TAB键或ESC键,用于命令补齐;按下一次TAB键,用于文件名补齐。 

查询命令历史
	用户在Shell下的操作是有很大连续性的,曾经输入的命令可能需要多次使用。当用户在操作中发现问题,需要查看曾经执行过的操作。Bash将用户曾经键入的命令序列保存在一个命令历史表中。按“”键,便可逐条向上追溯曾经使用过的命令,并显示在命令提示符处;按“”键,便可向下查询命令历史。
	除了使用上下键,可以翻阅历史命令外,Bash Shell还提供了history命令。该命令将命令历史表按列表形式,从记录号1开始,一次性全部显示出来。  
	history  [numberline]
通配符
	当需要用命令处理一组文件,例如file1.txt、file2.txt、file3.txt……,用户不必一一输入文件名,可以使用Shell通配符。Shell命令的通配符含义如下表 
通配符 含义 实例
星号(*) 匹配任意长度的字符串 file_*.txt,匹配* file_wang.txt、 file_Lee.txtfile3_Liu.txt
问号(? 匹配一个长度的字符 flie_?.txt,匹配 file_1.txtfile1_2.txt、 *file_3.txt **
方括号([] 匹配其中指定的一个字符 用 ** file_[otr].txt,匹配 file_o.txtfile_r.txtfile_t.txt
方括号([ - ] 匹配指定的一个字符范围 file_[a-z].txt,匹配file_a.txtfile_b.txt,直到file_z.txt
方括号([…] 除了其中指定的字符,均可匹配 file_^tr.txt,除了file_o.txtfile_r.txtfile_t.txt的其他文件
管道 
管道可以把一系列命令连接起来,意味着第一个命令的输出将作为第二个命令的输入,通过管道传递给第二个命令,第二个命令的输出又将作为第三个命令的输入,以此类推。就像通过使用“|”符连成了一个管道。
重定向
输入/输出重定向
输入/输出重定向是改变Shell命令或程序默认的标准输入/输出目标,重新定向到新的目标。
Linux中默认的标准输入定义为键盘,标准输出定义为终端窗口。
用户可以为当前操作改变输入或输出,迫使某个特定命令的输入或输出来源为外部文件。 
重定向符 含义 实例
> file 将file文件重定向为输出源,新建模式 ls /usr > Lsoutput.txt,将ls /usr的执行结果,写到Lsoutput.txt文件中,若有同名文件将被删除
>> file 将file文件重定向为输出源,追加模式 ls /usr >> Lsoutput.txt,将ls /usr的执行结果,追加到Lsoutput.txt文件已有内容后
< file 将file文件重定向为输入源 wc < file1,将file1中的内容作为输入传给wc命令
2> 或 &> 将由命令产生的错误信息输入到 ls noexistingfile.txt 2> err.log,使用ls命令,查看一个不存在的文件时,将系统错误提示保存在err.log文件中
命令替换
命令替换是将一个命令的输出作为另一个命令的参数。命令格式如下所示。

其中,命令command2的输出将作为命令command1的参数。需要注意,命令置换的单引号为ESC键下方的“`”键 

pwd命令用于显示当前目录的绝对路径。在上面的命令行中,使用命令置换符,将pwd的运行结果作为ls命令的参数。最终,命令执行结果是显示当前目录的文件内容。

系统基本命令

ls:	   列出文件名
cat:	显示文本文件
less/more:分屏显示文件
rm:	删除文件
cp:		复制文件
mv:	移动文件
mkdir:	创建目录
rmdir:	删除目录
cd:		转换目录

grep:	查找字符串
head:	显示文件开头
tail:	显示文件结尾
sort:	按次序显示文件
uniq:	去掉文件中相邻重复的行
diff:	比较两个文件
file:	查看文件类型

echo:	显示文本
date:	显示时间和日期
gzip:	压缩文件
gunzip:	解压缩文件
bzip2:	压缩文件
tar:	归档和展开文件
whereis:   查找命令
which:	查找实用程序

tar命令的基本语法如下:

tar [选项] [tar文件] [文件或目录...]
其中,选项用于指定tar命令的具体操作,如创建新的tar文件、解压tar文件等。tar文件是指打包后的文件,通常以.tar、.tar.gz、.tar.bz2等为扩展名。文件或目录则是指需要打包或解压的目标。

常用的tar命令参数
-c 或 --create:创建新的tar文件。
-x 或 --extract 或 --get:解压tar文件。
-t 或 --list:列出tar文件中的内容。
-z 或 --gzip 或 --ungzip:通过gzip指令处理tar文件。
-j 或 --bzip2:通过bzip2指令处理tar文件。
-v 或 --verbose:显示命令执行过程中的详细信息。
-f 或 --file:指定tar文件的名称。
-p 或 --preserve-permissions:保留原文件的权限。

作业

1、完成练习中的多文件编程以及使用简单makefile实现工程管理

1.先创建3个文件 Func.c Func.h mainCode.c

alt

2.对文件做相应的修改

Func.h 代码

/*===============================================
*   文件名称:Func.h
*   创 建 者:     
*   创建日期:2025年07月22日
*   描    述:
================================================*/
#ifndef __FUNC_H__
#define __FUNC_H__

#include <stdio.h>
typedef void FUNC(void * ,int ,int );
typedef void FUNCP(void *);

void sort_int(void *p,int len,int size);

void sort_float(void *p,int len,int size);

void sort_char(void *p,int len,int size);

void print_int(void *p);

void print_float(void *p);

void print_str(void *p);

void show_arr(const void *arr, int len,int size,FUNCP *print_data);

void sort(void * const p,int len,int size,FUNC *sort_data);

#endif

Func.c 代码

/*===============================================
*   文件名称:Func.c
*   创 建 者:     
*   创建日期:2025年07月22日
*   描    述:
================================================*/
#include "Func.h"

//整型排序
void sort_int(void *p,int len,int size)
{
    for(int i = 0 ; i < len - 1 ; i++)
        for(int j = 0 ; j < len - i - 1 ; j++)
            if(*(int *)(p+j*size) > *(int *)(p+j*size+size))
            {
                int temp = *(int *)(p+j*size);
                *(int *)(p+j*size) = *(int *)(p+j*size+size);
                *(int *)(p+j*size+size) = temp;
            }
}
//浮点型排序
void sort_float(void *p,int len,int size)
{
    for(int i = 0 ; i < len - 1 ; i++)
        for(int j = 0 ; j < len - i - 1 ; j++)
            if(*(float *)(p+j*size) > *(float *)(p+j*size+size))
            {
                float temp = *(float *)(p+j*size);
                *(float *)(p+j*size) = *(float *)(p+j*size+size);
                *(float *)(p+j*size+size) = temp;
            }
}
//字符排序
void sort_char(void *p,int len,int size)
{
    for(int i = 0 ; i < len - 1 ; i++)
        for(int j = 0 ; j < len - i - 1 ; j++)
            if(*(char *)(p+j*size) > *(char *)(p+j*size+size))
            {
                char temp = *(char *)(p+j*size);
                *(char *)(p+j*size) = *(char *)(p+j*size+size);
                *(char *)(p+j*size+size) = temp;
            }
}

void print_int(void *p)
{
    printf("%d ",*(int *)p);
}
void print_float(void *p)
{
    printf("%.2f ",*(float *)p);
}
void print_str(void *p)
{
    printf("%c",*(char *)p);
}
void show_arr(const void *arr, int len,int size,FUNCP *print_data)
{
    char *p = (char *)arr;
    for(int i = 0 ; i < len ; i++)
    {
        print_data(p);
        p+=size;
    }
    printf("\n");
}

void sort(void * const p,int len,int size,FUNC *sort_data)
{
    sort_data(p,len,size);
}

mainCode.c 代码

/*===============================================
*   文件名称:mainCode.c
*   创 建 者:     
*   创建日期:2025年07月22日
*   描    述:
================================================*/
#include "Func.h"

int main(int argc, char *argv[])
{ 
    int a[8] = {1,2,33,14,55,62,7,28};
    printf("------------int------------\n");
    show_arr(a,8,sizeof(int),print_int);
    sort(a,8,sizeof(int),sort_int);
    show_arr(a,8,sizeof(int),print_int);
    
    float b[8] = {11.2,2.3,31.5,14.5,25.6,6.44,71.22,18.22};
    printf("------------float------------\n");
    show_arr(b,8,sizeof(float),print_float);
    sort(b,8,sizeof(float),sort_float);
    show_arr(b,8,sizeof(float),print_float);
    
    char c[32] = "gfedcba";
    printf("------------string------------\n");
    show_arr(c,7,sizeof(char),print_str);
    sort(c,7,sizeof(char),sort_char);
    show_arr(c,7,sizeof(char),print_str);
    return 0;
    return 0;
}

3.用Makefile进行编译

Makefile代码

main:Func.c mainCode.c
	gcc Func.c mainCode.c -o main -I ./

alt

4.运行

alt

2、练习Shell命令

 1789  clear
 1790  cd ..
 1791  ls
 1792  ls 7-?
 1793  ls 7*
 1794  ls *
 1795  clear
 1796  ls *
 1797  clear
 1798  ls
 1799  clear
 1800  cd 7-22
 1801  clear
 1802  ls
 1803  ls MyCode/ > file.txt
 1804  ls
 1805  cat file.txt 
 1806  ls MyCode/ >> file.txt 
 1807  ls
 1808  clear
 1809  cat file.txt 
 1810  clear
 1811  pwd
 1812  ls
 1813  pwd >> file.txt 
 1814  cat file.txt 
 1815  clear
 1816  grep -w
 1817  grep -WC -w
 1818  clear
 1819  head file.txt 
 1820  tail file.txt 
 1821  clear
 1822  file file.txt 
 1823  clear
 1824  tar -cvf file.tar file.txt 
 1825  ls
 1826  tar
 1827  tar --help
 1828  clear
 1829  ls
 1830  tar -xv
 1831  tar -xvf file.tar
 1832  clear
 1833  ls
 1834  rm file.txt
 1835  ls
 1836  clear
 1837  tar -xvf file.tar 
 1838  vi
 1839  ls
 1840  cat file.txt
 1841  clear
 1842  history