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
命令行提示符
username:用户名,显示当前登录用户的账户名;
hostname:主机名,显示登录的主机名,例如若远程登录后,则显示登录的主机名;
direction:目录名,显示当前所处的路径,当在根目录下显示为“/”,当在用户主目录下显示为“~”;
例如当前Shell提示符为“wdl@UbuntuFisher:~/Examples$”,用户名为“wdl”,主机名为“UbuntuFisher”,目录名为“~/Examples”,即用户主目录下的/Examples目录。
命令格式
$: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.txt、 file3_Liu.txt |
问号(?) | 匹配一个长度的字符 | 用 flie_?.txt,匹配 file_1.txt、file1_2.txt、 *file_3.txt ** |
方括号([…]) | 匹配其中指定的一个字符 | 用 ** file_[otr].txt,匹配 file_o.txt 、file_r.txt和file_t.txt |
方括号([ - ]) | 匹配指定的一个字符范围 | 用 file_[a-z].txt,匹配file_a.txt、file_b.txt,直到file_z.txt |
方括号([…]) | 除了其中指定的字符,均可匹配 | 用 file_^tr.txt,除了file_o.txt、file_r.txt和file_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
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 ./
4.运行
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