2023年8月3日发(作者:)

ubuntu及shell脚本常⽤命令⼊门⼀、Shell命令⼆、ubuntu软件安装⽅法三、Ubuntu⽂件系统结构四、ubuntu磁盘⽂件五、Linux下常⽤的压缩格式六、linux⽤户和⽤户组七、Ubuntu/Linux⽂件权限⼋、linux连接⽂件九、vim编辑器⼗、linux C编程⼗⼀、Makefile的基本语法⼗⼆、shell脚本⼊门⼀、Shell命令查看命令详细信息 命令 --help1、⽬录信息查看命令ls

ls -a 显⽰⽬录所有⽂件及⽂件夹,包括隐藏⽂件,⽐如以.开头的 ls -l 显⽰⽂件的详细信息 ⽂件名后*代表可执⾏⽂件 ls ⽬录 查看某⼀⽬录下的⽂件 ls test/* 查看test⽬录下所有⽂件及⼦⽂件2、⽬录切换命令 cd

tab键补全⽬录剩余信息3、当前路径显⽰命令 pwd4、系统信息查看命令 uname uname -a 查看系统版本内核等详细信息5、清理屏幕命令 clear6、显⽰⽂件内容命令 cat cat /etc/profile7、切换⽤户⾝份命令 sudo sudo apt-get install mplayer8、⽂件拷贝命令 cp cp a.c b.c ->把a.c拷贝到b.c cp -r test1 test2 复制test1⽬录到test2⽬录9、切换⽤户命令 su sudo su 切换管理员⾝份 sudo su zkh 切换回⽤户⾝份10、移动⽂件命令 mv mv a.c b.c 可⽤于⽂件的重命名 mv test/ test1/ 重命名⽂件夹 mv a.c test1/11、创建⽂件夹命令 mkdir mkdir test12、创建⽂件命令 touch touch a.c13、删除命令 rm rm a.c 删除a.c⽂件 rm ⽬录 -f 强制删除 删除不询问... -r 递归删除 把⽬录及⼦⽬录⽂件全都删除 不然⽆法删除⽬录 -rf 可删除⽂件夹 或使⽤ rmdir14、⽬录删除命令 rmdir15、显⽰⽹络配置信息命令 ifconfig 可显⽰⽹卡信息 ifconfig -a 查看所有⽹卡的信息 sudo ifconfig ⽹卡名 up 挂载⽹卡 sudo ifconfig ⽹卡名 down 禁⽤⽹卡 sudo ifconfig ⽹卡名 IP地址 修改IP地址 ifconfig --help 查看命令帮助16、重启命令 reboot17、关机命令 poweroff18、系统帮助命令 man18、系统帮助命令 man man printf 查看printf函数的详细信息 快速查询系统详细设计⽂件 --help只显⽰⼀部分 man为查看完整的设计⽂件19、数据同步写⼊磁盘命令 sync 将缓冲区中的数据写⼊磁盘 以免在拔出磁盘的时候 缓冲区的数据尚未写⼊20、查找⽂件命令 find find -name ⽂件名 查找当前⽬录及⼦⽬录下⽂件所在位置21、查找内容命令 grep grep -r 查找⽂件夹下所有⼦⽂件内容中符合的内容 -n 标出符合那⼀⾏的列数 -i 忽略⼤⼩写 grep -nr "ubuntu" / 查找内容 查找⽬录22、⽂件夹⼤⼩查看命令 du du -sh 查看⽬录/⽂件占⽤磁盘空间⼤⼩ 不显⽰⼦⽬录 -s 查看⽬录占⽤磁盘空间⼤⼩ 不显⽰⼦⽬录和⽂件 -h 以⼈类可读的⽅式显⽰占⽤磁盘空间⼤⼩ du ⽬录 查看⽬录及⼦⽬录23、磁盘空间检查命令 df df -h 查看磁盘空间 以⼈类可读⽅式24、使⽤gedit打开某个⽂件命令 gedit gedit为软件 使⽤图形化界⾯进⾏⽂件的编辑 gedit a.c25、当前的系统进程查看命令 ps ps -aux 显⽰包含所有其他使⽤者的进程 嵌⼊式⼀般为单⽤户 因此⼀般使⽤ps 就⾏ 具体请查看man ps26、进程实时运⾏状态查看命令 top27、⽂件类型查看命令 file ⼀般在ubuntu上编译arm上运⾏的软件 需要查看下编译后的⽂件类型 可执⾏⽂件会显⽰给x86 还是arm运⾏ file a.c⼆、ubuntu软件安装⽅法1、apt⼯具安装 (常⽤) sudo apt-get install 软件名称 sudo apt-get install git sudo apt-get install mplayer2、deb软件包安装 (⼤型图形界⾯软件) 在windows下安装为.exe⽂件 在ubuntu下则为.deb⽂件 可以直接双击安装 sudo dpkg -i 安装⽹易云⾳乐,3、源代码安装 (较少) (1)、百度下载tree源代码压缩包 (2)、解压 (3)、阅读readme 或install 查看如何安装 (4)、make 编译 (5)、sudo make install 安装 (6)、测试 tree --help 有些软件可能需要make config再安装4、app store5、其他安装⽅法QT安装 扩展名.run 得先安装IDE 百度三、Ubuntu⽂件系统结构 /bin 存放⼆进制可执⾏⽂件,这些命令在单⽤户模式下也能够使⽤。可以被root和⼀般的账号使⽤。 /boot Ubuntu内核和启动⽂件,⽐如vmlinuz-xxx。gurb引导装载程序。

/grub ⽤来启动ilnux vmlinux-4.15.0 linux内核⽂件 /cdrom 因该是⽤来放光盘中的⽂件 /dev 设备驱动⽂件 嵌⼊式开发时 设备的驱动⽂件存放位置 对设备进⾏操作也是通过⽂件进⾏操作 sda 磁盘⽂件 想写磁盘的话 直接对⽂件进⾏操作 /etc 存放⼀些系统配置⽂件,⽐如⽤户账号和密码⽂件,各种服务的起始地址。 profile⽂件 ⽤于存放环境变量的⼀些配置 /home 系统默认的⽤户主⽂件夹,⼀般创建⽤户账户的时候,默认的⽤户主⽂件夹都会放到此⽬录下。 zkh/

lib/ 系统运⾏所需库 x86_64-linux-gnu/

.so linux下的⼀些动态库 /lib 存放库⽂件 /media 此⽬录下放置可插拔设备,⽐如SD卡,或者U盘就是挂载到这个⽬录中。 zkh/ 查看可插拔设备 /mnt ⽤户可使⽤的挂载点,如果要挂载⼀些额外的设备,那么就可以挂载到此处。 hgfs/ 可⽤来与windows系统作为共享⽂件夹 /opt 可选的⽂件和程序存放⽬录,给第三⽅软件放置的⽬录。 /root root⽤户⽬录,也就是系统管理员⽬录。 /sbin 和/bin类似,也是存放⼀些⼆进制可执⾏⽂件。sbin下⾯的⼀般是系统开机过程中所需要的命令。 /snap 包管理⼯具 /srv 服务相关⽬录。⽐如⽹络服务。 /sys 记录内核信息,虚拟⽂件系统。 /tmp 临时⽬录 /var 存放⼀些变化的⽂件,⽐如⽇志⽂件 /usr usr不是user的缩写,⽽是UNIX Software Resource的缩写,存放与系统⽤户有关的⽂件,会占⽤很⼤的存储空间! /proc 虚拟⽂件系统,数据放置到内存中,存放系统运⾏信息 cat proc/cpuinfo 查看cpu信息四、ubuntu磁盘⽂件u盘格式设为FAT32 适合嵌⼊式linux1、ubuntu磁盘⽂件 /dev/sd*⽂件,此类⽂件是磁盘设备⽂件,并不能直接访问磁盘,必须要将磁盘挂载到某⼀个⽬录下才可以访问。 /dev/sdb和/dev/sdb1是U盘的设备⽂件。 /dev/sdb表⽰U盘,/dev/sdb1表⽰U盘的第⼀个分区。 cd /dev ls sd* 列出磁盘⽂件2、磁盘和⽬录的容量查询命令 df:列出⽂件系统的整体磁盘使⽤量。主要查看个⽂件系统的使⽤量, du:评估⽂件系统的磁盘使⽤量,主要查看单个⽂件的⼤⼩。 du -h 显⽰u盘下所有⽂件(包括⼦⽂件)的空间使⽤量 du -h --max-depth=1 只显⽰⼀层的⽬录空间使⽤情况3、磁盘挂载与卸载,分区和格式化、 1、磁盘的挂载和卸载 dev为设备的连接 media为挂载点 mount和umount命令 视频中没卸载成功 哈哈 打开了⽂件怎么会卸载成功呢 sudo umount ⽬录 ⽬录为/media/zkh/中的⽂件名 -f 强制卸载 不⽤也⾏ cd /media/zkh/ sudo mkdir 新建挂载点 挂载只能挂实际内容sdb1 不能sdb sudo mount /dev/sdb1 /media/zkh/udisk/ 将sdb1挂载到udisk⽂件夹下 -o iocharset=utf8 解决⽂件名中⽂乱码问题 不⽤也⾏ 2、磁盘分区 fdisk命令 sudo fdisk -l 查看磁盘分区 sudo fdisk /dev/sdb 进⼊操作帮助进⾏磁盘操作 p为主分区 e为可⽤空间 操作后需要保存 如果删除u盘分区则有时候需要把u盘卸载 创建中的扇区表⽰空间⼤⼩的区间 创建后有时候需要格式化才能挂载 3、磁盘格式化 磁盘分区创建好以后就可以格式化磁盘,使⽤命令mkfs。如: sudo mkfs -t vfat /dev/sdx -t 所安装的⽂件系统类型 分区后windows系统下就可以看到⼏个u盘分区 删除分区 windows下可以通过SDFormat软件将磁盘分区删除

也可以在linux下把分区删除在重新创建⼀个⼤的分区五、Linux下常⽤的压缩格式–help 查看各参数帮助信息1、Linux下常⽤的压缩扩展名有:.tar、.2、.。2、Windows下7ZIP软件的安装 安装7ZIP 因为Linux下很多⽂件是.bz2,.gz结尾的压缩⽂件,因此需要在windows下安装7ZIP软件。 可通过将⽂件压缩为tar后再压缩为23、gzip压缩⼯具 只会对⽂件进⾏压缩(能递归压缩⽂件夹) 不会进⾏打包 .gzip⼯具负责压缩和解压缩.gz格式的压缩包。 gzip xxx //压缩 a.c ⽂件会压缩为 gzip -d //解压缩 ⽂件会解压缩为a.c gzip对⽂件夹进⾏压缩 gzip -r xxx //对⽂件夹进⾏压缩 gzip -rd //对⽂件夹进⾏解压缩 gzip虽然可以对⽂件夹进⾏压缩,但是并不能提供打包的服务,只是对⽂件夹中的所有⽂件进⾏了单独的压缩。 对于⽂件夹来说并不压缩 只压缩⽂件夹下的⽂件。4、bzip2压缩⼯具 只会对⽂件进⾏压缩(不能递归压缩⽂件夹) 不会进⾏打包 和gzip类似,只是bzip2⼯具负责压缩和解压缩.bz2格式的压缩包。 bzip2 -z xxx //压缩 a.c ⽂件会压缩为2 bzip2 -d 2 //解压缩 2⽂件会解压缩为a.c5、tar打包⼯具 tar⼯具参数: -f,使⽤归档⽂件或 ARCHIVE 设备 使⽤归档的名字(⼀般放于最后) -c:创建新归档,创建压缩⽂件 -x:从归档中解出⽂件,解压缩 -j:使⽤bzip2压缩格式。 -z:使⽤gzip压缩格式 -v:打印出命令执⾏过程。 参数的顺序有要求 tar⼯具提供打包服务,就是将多个⽂件打包,⽐如 tar -vcf test //将test打包成 tar -vxf //解包 上⾯的tar命令只提供了打包和解包的功能,tar在提供打包和解包的同时使⽤gzip/bzip2进⾏压缩,实现类似windwos下winRAR软件的命令。

1、对.2进⾏压缩和解压缩 tar -vxjf 2 解压缩 tar -vcjf 2 xxx 压缩 2、对.进⾏压缩和解压缩 tar -vxzf //解压缩 tar -vczf xxx //压缩

6、其他格式的压缩和解压缩 1、.rar格式 查找帮助直接rar 不⽤--help 需要先安装rar:sudo apt-get install rar rar x //解压缩 rar a xxx //压缩 2、.zip格式 查找帮助直接rar 不⽤--help zip格式压缩使⽤“zip“命令: zip -rv xxx

zip格式解压缩使⽤“unzip”命令: unzip //解压⽂件 unzip -v //只查看压缩⽂件内容 不解压六、linux⽤户和⽤户组1、⽤户Linux是⼀个多⽤户操作系统,不同的⽤户拥有不同的权限。可以查看和操作不同的⽂件。 Ubuntu有三种⽤户:1、初次创建的⽤户。 2、root⽤户 3、普通⽤户。初次创建的⽤户权限⽐普通⽤户多,但是没有root⽤户多。 Linux⽤户记录在/etc/passwd这个⽂件内。 Linux⽤户密码记录在/etc/shadow这个⽂件内。 每个⽤户都有⼀个ID,叫做UID。2、⽤户组 为了⽅便管理,将⽤户进⾏分组。这样就可以设置⾮本组⼈员不能访问某些⽂件。每个⽤户可以属于多个不同的组。 ⽤户:家⾥有你、弟弟、妹妹个⼈,每个⼈都有⾃⼰的房间,你们三个⼈都是⽤户,你们都不能随便的乱翻别⼈的房间。 ⽤户组:你们三个都是⼀个家庭的,也就是属于同⼀个⽤户组,你们三个可以共⽤厨房,书房等空间。 ⽤户组为共享给组内⽤户公共资源 并不影响⽤户的私⼈资源 ⼀个⽤户可加⼊多个组 因此: ⽤户和⽤户组的存在就是为了控制⽂件的访问权限的。 每个⽤户组都有⼀个ID,叫做GID。 ⽤户组及⽤户信息存储在/etc/group⽂件中。 组名 密码 ID 包含的⽤户 ⽤户及⽤户组共⽤⼀套ID即 ⽤户和⽤户组排在同⼀ID序列中3、创建⽤户和⽤户组 (1)、图形化界⾯创建 要使⽤图形化界⾯创建⽤户和⽤户组的话就需要安装gnome-system-tools这个⼯具: sudo apt-get install gnome-system-tools (2)、命令创建⽤户和⽤户组 要加sudo 添加⽤户:adduser命令,adduser ⽤户名 ⽤户查询:finger命令,finger ⽤户名 修改⽤户密码:passwd命令,passwd ⽤户名 删除⽤户:deluser命令,deluser ⽤户名 添加⽤户组:addgroup命令,addgroup ⽤户组名 显⽰⽤户所属⽤户组:groups命令,groups ⽤户名 删除⽤户组:delgroup命令,delgroup⽤户组名

可通过修改⽤户权限、修改/etc/group、图形等⽅式把⽤户添加到⽤户组中 命令创建可以只有三位密码 图形不⾏ 修改密码只能在所在的⽤户中 或sudo七、Ubuntu/Linux⽂件权限1、⽂件权限是指不同的⽤户或⽤户组对某个⽂件拥有的权限,⽂件的权限分为三种:r: 读 w:写 x:可执⾏。 ⽂件描述形式如下: -rw-rw-r—就是⽂件权限,第⼀位表⽰⽂件类型,剩下的每三位表⽰⼀组权限。分别对应拥有者权限、拥有者所在组权限、其他⽤户权限。可以使⽤⼆进制表⽰⽂件权限。 r=4 w=2 x=1 a.c⽂件信息: --rw-rw-r--,a.c所属⽤户拥有读写权限⽆可执⾏权限。组内其他⽤户拥有读写权限⽆可执⾏权限,其他⽤户仅有可读权限。 zkh zkh ⽤户 ⽤户组 ls -l /dev列出⽂件的详细信息 列出的开头第⼀个字母为⽂件类型 b 块⽂件 c 字符⽂件2、Ubuntu/Linux⽂件权限修改 1、修改⽂件权限命令 chmod命令 777 开放所有权限 a 所有⽤户 u 归属⽤户 g 归属组 o 其他⽤户 w r x 权限 u+x 所属⽤户添加执⾏权限 chmod 777 ⽂件名 2、修改⽂件所属⽤户 chown命令

sudo chown root ⽂件名 将⽂件所属⽤户修改为root sudo chown .root ⽂件名 将⽂件所属组改为root sudo chown ⽂件名 ⽂件所属⽤户所属组⼀起修改为root sudo chown -R ⽂件夹 ⽂件夹中所有的⽂件⼀起修改 ⽂件中本⽤户⽆法执⾏ 组外⽤户可执⾏ 把⽂件所属⽤户调为组外⽤户 本⽤户即可执⾏所有⽤户都具有w权限时 ⽂件名会⾼亮gcc hello.c -o hello 编译c⽂件 输出hello为可执⾏⽂件⼋、linux连接⽂件Linux有两种连接⽂件:符号连接(软连接)和硬链接,符号链接类似Windows下的快捷⽅式。硬链接通过⽂件系统的inode连接来产⽣新⽂件名,⽽不是产⽣新⽂件。inode:记录⽂件属性,⼀个⽂件⼀个inode。inode相当于⽂件ID,查找⽂件的时候要先找到inode,然后才能读出⽂件的内容。⼆、ln命令 ln命令⽤于创建连接⽂件: ln [选项] 源⽂件 ⽬标⽂件 选项:-s 创建符号链接(软连接) -f 强制创建连接⽂件,如果⽬标存在,那么先删除掉⽬标⽂件,然后再建⽴连接⽂件。三、硬连接 硬链接是多个⽂件都指向同⼀个inode,硬链接知识点: ①、具有相同inode的多个⽂件互为硬链接⽂件,创建硬链接相当于⽂件实体多了⼊⼝。 ②、对于硬链接⽂件,只有删除了源⽂件以及对应的所有硬连接⽂件,⽂件实体才会被删除。 ③、根据硬链接⽂件的特点,我们可以通过给⽂件创建硬连接的⽅式来防⽌⽂件误删除。 ④、不论修改源⽂件还是连接⽂件,另⼀个⽂件的数据都会被改变。 (与源⽂件占⽤⼤⼩相同) ⑤、硬连接不能跨⽂件系统。 ⑥、硬连接不能连接到⽬录。 ln ⽂件名 连接⽂件名相当于把⽂件复制后相关联起来,⽅便多地操作因为以上这些限制,硬链接其实不常⽤。四、符号连接(软连接) 类似于指针 符号连接类似Windows下的快捷⽅式,符号链接也叫做软连接,软连接要⽤的多。符号连接相当于创建了⼀个独⽴的⽂件,这个⽂件会让数据读取指向它连接的哪个⽂件的⽂件名。软连接的特点: ①、可以连接到⽬录。 ②、可以跨⽂件系统。 ③、删除源⽂件以后,软连接⽂件也就“打不开了”。 ④、符号连接⽂件通过->来指⽰具体的连接⽂件。 ⑤、符号连接要使⽤绝对路径,否则连接出问题。 当cp的使⽤要⽤-d 且如果不是绝对路径 赋值后⽂件⽆效 cp的时候要把⽬录下保持所有⽂件的连接 就要-d 否则⽂件将复制 且链接⽂件要使⽤绝对路径

ln -s ⽂件绝对路径 连接⽂件名 绝对路径~也可使⽤之前jupyter操作⽬录下的其他地⽅的磁盘⽂件就是依照此原理⽂件类型为lll == ls -l -i 查看⽂件连接九、vim编辑器Linux系统都会⾃带vi编辑器,但是vi编辑器太难⽤了!所以建议⼤家安装vim编辑器,安装命令:sudo apt-get install vim1、vim编辑器三种⼯作模式 vi xxx 使⽤vi编辑器打开⽂件。 ⼀般模式(指令模式):默认模式,⽤vi打开⼀个⽂件以后⾃动进⼊到此模式。 编辑模式:⼀般模式中⽆法编辑⽂件,要编辑⽂件就要进⼊编辑模式,按下“i、I、a、A、o、O、s、r”等就会进⼊到编辑模式。⼀般按下“a”进⼊编辑模式。按下ESC键可退出编辑模式。 命令⾏模式(底⾏模式):先进⼊到⼀般模式,然后输⼊:、/、?这三个中的任意⼀个就可以进⼊到命令⾏模式。 /xxx,表⽰在⽂件中查找xxx 视频⽤a 不过个⼈习惯⽤i 详情可看开发板的开发⼿册 【注意】(不建议)如果不正常退出 可删除.⽂件名.swp 但之前编辑的⽂件内容也会删除

2、保存退出 当⽂件编辑好以后,输⼊:wq来保存退出。:q退出,:q!不保存退出,:w保存。 :q退出 修改后不保存或!的话退不出去 保存退出:wq 或:x3、其他操作⽅式 (1)、按下键盘上的上下左右键来控制光标。 ⼀般模式下: (1)、dd,删除光标所在⾏,ndd,删除光标所在⾏及其下n⾏。 (2)、u,撤销,恢复上⼀步。 (3)、. ,重复前⼀个操作。 (4)、yy,复制光标所在⾏ (5),nyy,复制光标所在向下n⾏,⽐如10yy就是复制光标下10⾏。 (6),p和P,p为复制到光标下⼀⾏,P复制到光标上⼀⾏。 (7)、屏幕上下移动 ctrl+f ctrl+b 上下翻⼀页 front back ctrl+d ctrl+u 上下翻半页 down up⼗、linux C编程可参考开发指南第三章1、编写C程序使⽤VIM编辑器编写程序,也可以使⽤vscode。1.1、设置vim编辑器 设置vim编辑器,⼀个TAB=4个字节。 sudo vi /etc/vim/vimrc 最后输⼊ set ts=4 设置vim编译器,显⽰⾏号。 set nu 1.2、编写C程序2、编译C程序

使⽤gcc编译器编译C程序。 编译单个⽂件 gcc -v ⽀持x86 可在x86电脑上编译arm的⽂件 gcc --help gcc 默认编译连接为可执⾏⽂件 ⽣成.out⽂件 -o 输出⽂件名 -O 优化编译 可通过-o指定⽂件名 -O2 更深层优化 可通过-o指定⽂件名 -v 查看过程 详细信息查看开发⼿册 编译流程:预处理(宏) -> 汇编 -> 编译 -> 链接 多个⽂件时 ⽣成.o ⽤于makefile编译 gcc main.c calcu.c input.c -o main

gcc -c main.c gcc -c calcu.c gcc -c input.c gcc main.o calcu.o input.o -o main 这样修改了哪个就可以只重新编译哪个为o3、make⼯具和Makefile⽂件 编译整个⼯程⽂件 当源码⽂件⽐较多的时候就不适合通过直接输⼊gcc命令来编译,这时候就需要⼀个⾃动化的编译⼯具. make:⼀般说GNU Make,是⼀个软件,⽤于将源代码⽂件编译为可执⾏的⼆进制⽂件, make⼯具主要⽤于完成⾃动化编译。make⼯具编译的时候需要Makefile⽂件提供编译⽂件。 实现⾃动化编译 且可只编译修改项的相应⽂件 避免不必要的编译 Makefile(makefile):make⼯具所使⽤的⽂件,Makefile指明了编译规则。 ⽣成(⽬标):需要(依赖) 执⾏ main:main.o input.o calcu.o gcc -o main main.o input.o calcu.o main.o:main.c gcc -c main.c input.o:input.c

gcc -c input.c

calcu.o:calcu.c

gcc -c calcu.c

clean: rm *.o rm main

执⾏ make

make clean makefile编译规则详情看开发指南 编写⼀个⼩型的含有多个.c⽂件的C程序。⼗⼀、Makefile的基本语法变量要声明为全局1、Makefile中的变量为字符串 可通过变量代替较长的依赖 objects = main.o input.o calcu.o main: $(objects) gcc -o main $(objects) ...

name = zkh curname = $(name) name = zkh2 print: @echo $(curname) 输出zkh2 Makefile中变量的值取决于他所引⽤的变量最后⼀次的有效值 可通过:=来赋值 类似正常=赋值 = 如果前⾯没有被赋值 则赋值 否则使⽤前⾯的赋值 += 在字符串后⾯添加2、shell命令前加@不将执⾏过程显⽰出来 也可不加3、通配符% ⾃动化变量 ⽤于批量编译

⽬标%中的内容取决于依赖%中的值 %.o:%.c gcc -c $< 命令 $@ 规则中的⽬标集合,在模式规则中,如果有多个⽬标的话,“$@”表⽰匹配模 式中定义的⽬标集合。 $% 当⽬标是函数库的时候表⽰规则中的⽬标成员名,如果⽬标不是函数库⽂件, 那么其值为空。 $< 依赖⽂件集合中的第⼀个⽂件,如果依赖⽂件是以模式(即“%”)定义的,那么 “$<”就是符合模式的⼀系列的⽂件集合。 $?

所有⽐⽬标新的依赖⽬标集合,以空格分开。 $^ 所有依赖⽂件的集合,使⽤空格分开,如果在依赖⽂件中有多个重复的⽂件, “$^”会去除重复的依赖⽂件,值保留⼀份。 $+

和“$^”类似,但是当依赖⽂件存在重复的话不会去除重复的依赖⽂件。 $* 这个变量表⽰⽬标模式中"%"及其之前的部分,如果⽬标是 test/.c,⽬标模 式为 a.%.c,那么“$*”就是4、makefile伪⽬标 如clean 当⼯程中有名为clean的⽂件时就会执⾏失败 解决⽅法:将clean声明为伪⽬标 .PHONY:clean clean: ...5、makefile函数 不⽀持⾃定义函数 但有⾃带函数 具体详见光盘 -> 参考资料 -> 跟我⼀起写Makefile⼗⼆、shell脚本⼊门⼀、shell脚本⼊门我们已经能够熟练的在终端中输⼊命令来完成⼀些常⽤的操作,但是我们都是⼀条⼀条输⼊命令。这样会很⿇烦,那么有没有⼀种⽅式可以将很多条命令放到⼀个⽂件⾥⾯,然后直接运⾏这个⽂件即可?肯定有,这个就是shell脚本!shell脚本类似windows的批处理⽂件,shell脚本就是将连续执⾏的命令写成⼀个⽂件。shell脚本提供数组、循环、条件判断的等功能。shell脚本⼀般是Linux运维或者系统管理员要掌握的,作为嵌⼊式开发⼈员,只需要掌握shell脚本最基础的部分即可。⼆、shell脚本写法 shell脚本是个纯⽂本⽂件,命令从上⽽下,⼀⾏⼀⾏的开始执⾏。shell脚本扩展名为.sh。 shell脚本第⼀⾏⼀定要为: #!/bin/bash 表⽰使⽤bash。三、shell脚本语法 3.1第⼀个shell脚本

⼀般shell脚本⽂件需要添加执⾏权限 默认没有执⾏的权限 #!/bin/bash echo "hello world" 3.2、交互式shell脚本 read。 #!/bin/bash echo "input your name:" read name

echo "yourname:" $name

这中间不能加+ #!/bin/bash read -p "input your age and weight" age weight echo "your age=$age and weight=$weight" 3.3、shell脚本的数值计算 shell仅⽀持整形,数值计算使⽤$((表达式))。 #!/bin/bash echo "input two num:" read -p "first num" first read -p "second num " second total=$(($first+$second)) //加号两边加空格⽆影响 变量的赋值=两边不能有空格 echo "$first + $second = $total" 3.4、test命令 test命令⽤于查看⽂件是否存在、权限等信息,可以进⾏数值,字符,⽂件三⽅⾯的测试。 &&和||命令: cmd1 && cmd2 当cmd1执⾏完并且正确,那么cmd2开始执⾏,如果cmd1执⾏完毕错误,那么cmd2不执⾏。 cmd1 || cmd2 当cmd1执⾏完毕并正确,那么cmd2不执⾏,反之cmd2执⾏。

//查找⽂件是否存在 #!/bin/bash echo "input filename" read -p "filename" filename test -e $filename && echo "$filename exist" || echo "$filename not exist" //查看字符串是否相等 #!/bin/bash echo "input two string" read -p "firststring" firststr read -p "secondstring" secondstr

test $firststr == $secondstr && echo "firststring == secondstring" || echo "firststring != secondstring" 3.5、中括号[]判断符 [ ] ==或 != 输⼊前后加空格 ⽆论是否为变量 都需要加双引号 [ "$firststr" == "$secondstr" ] =两边空格不能少 不然会出错 多了倒是不会报错 //判断字符串是否相等 #!/bin/bash echo "input two string" read -p "firststring" firststr read -p "secondstring" secondstr

[ "$firststr" == "$secondstr" ] && echo "firststring == secondstring" || echo "firststring != secondstring" 3.6、默认变量 $0~$n,表⽰shell脚本的参数,包括shell脚本命令本⾝,shlle脚本命令本⾝为$0 $#:#表⽰最后⼀个参数的标号。 $@:表$1、$2、$3...... #!/bin/bash echo "file name: " $0 //根据执⾏⽂件时的路径来决定 是否是绝对路径或相对路径 各⾃输出不同 echo "num of param: " $# echo "whole param: " $@ echo "first param: " $1 echo "second param: " $2四、shell注释⽅式 单⾏ # 多⾏ 两处注释符号需要独⽴⼀⾏ 两者缺⼀不可 :<

"-h") help ;; "-c") close ;; *) echo "input can not identify" esac #!/bin/bash print(){ echo $1 $2 //$0与⽂件相同 但$1 开始为局部变量并不继承⽂件$1等 ⽆值则忽略 } print $1 $2七、shell循环 shell脚本也⽀持循环,⽐如 while do done,表⽰当条件成⽴的时候就⼀直循环,直到条件不成⽴。 输出未定义空变量不会报错

while [条件] //括号内的状态是判断式 do //循环开始 //循环代码段 done #!/bin/bash while [ "$value" != "close" ] do read -p "input string:" value done echo "stop while" 还有另外⼀种until do done,表⽰条件不成⽴的时候循环,条件成⽴以后就不循环了,写法如下: until [条件] do //循环代码段 done for循环,使⽤for循环可以知道有循环次数,写法 for var in con1 con2 con3…… do //循环代码段 done #!/bin/bash for name in zkh zkh1 zkh2 zkh3

do echo $name done for循环数值处理,写法 for((初始值; 限制值; 执⾏步长)) do //循环代码段 done #!/bin/bash read -p "input count: " count total=0 for((i=0;i

2023年8月3日发(作者:)

ubuntu及shell脚本常⽤命令⼊门⼀、Shell命令⼆、ubuntu软件安装⽅法三、Ubuntu⽂件系统结构四、ubuntu磁盘⽂件五、Linux下常⽤的压缩格式六、linux⽤户和⽤户组七、Ubuntu/Linux⽂件权限⼋、linux连接⽂件九、vim编辑器⼗、linux C编程⼗⼀、Makefile的基本语法⼗⼆、shell脚本⼊门⼀、Shell命令查看命令详细信息 命令 --help1、⽬录信息查看命令ls

ls -a 显⽰⽬录所有⽂件及⽂件夹,包括隐藏⽂件,⽐如以.开头的 ls -l 显⽰⽂件的详细信息 ⽂件名后*代表可执⾏⽂件 ls ⽬录 查看某⼀⽬录下的⽂件 ls test/* 查看test⽬录下所有⽂件及⼦⽂件2、⽬录切换命令 cd

tab键补全⽬录剩余信息3、当前路径显⽰命令 pwd4、系统信息查看命令 uname uname -a 查看系统版本内核等详细信息5、清理屏幕命令 clear6、显⽰⽂件内容命令 cat cat /etc/profile7、切换⽤户⾝份命令 sudo sudo apt-get install mplayer8、⽂件拷贝命令 cp cp a.c b.c ->把a.c拷贝到b.c cp -r test1 test2 复制test1⽬录到test2⽬录9、切换⽤户命令 su sudo su 切换管理员⾝份 sudo su zkh 切换回⽤户⾝份10、移动⽂件命令 mv mv a.c b.c 可⽤于⽂件的重命名 mv test/ test1/ 重命名⽂件夹 mv a.c test1/11、创建⽂件夹命令 mkdir mkdir test12、创建⽂件命令 touch touch a.c13、删除命令 rm rm a.c 删除a.c⽂件 rm ⽬录 -f 强制删除 删除不询问... -r 递归删除 把⽬录及⼦⽬录⽂件全都删除 不然⽆法删除⽬录 -rf 可删除⽂件夹 或使⽤ rmdir14、⽬录删除命令 rmdir15、显⽰⽹络配置信息命令 ifconfig 可显⽰⽹卡信息 ifconfig -a 查看所有⽹卡的信息 sudo ifconfig ⽹卡名 up 挂载⽹卡 sudo ifconfig ⽹卡名 down 禁⽤⽹卡 sudo ifconfig ⽹卡名 IP地址 修改IP地址 ifconfig --help 查看命令帮助16、重启命令 reboot17、关机命令 poweroff18、系统帮助命令 man18、系统帮助命令 man man printf 查看printf函数的详细信息 快速查询系统详细设计⽂件 --help只显⽰⼀部分 man为查看完整的设计⽂件19、数据同步写⼊磁盘命令 sync 将缓冲区中的数据写⼊磁盘 以免在拔出磁盘的时候 缓冲区的数据尚未写⼊20、查找⽂件命令 find find -name ⽂件名 查找当前⽬录及⼦⽬录下⽂件所在位置21、查找内容命令 grep grep -r 查找⽂件夹下所有⼦⽂件内容中符合的内容 -n 标出符合那⼀⾏的列数 -i 忽略⼤⼩写 grep -nr "ubuntu" / 查找内容 查找⽬录22、⽂件夹⼤⼩查看命令 du du -sh 查看⽬录/⽂件占⽤磁盘空间⼤⼩ 不显⽰⼦⽬录 -s 查看⽬录占⽤磁盘空间⼤⼩ 不显⽰⼦⽬录和⽂件 -h 以⼈类可读的⽅式显⽰占⽤磁盘空间⼤⼩ du ⽬录 查看⽬录及⼦⽬录23、磁盘空间检查命令 df df -h 查看磁盘空间 以⼈类可读⽅式24、使⽤gedit打开某个⽂件命令 gedit gedit为软件 使⽤图形化界⾯进⾏⽂件的编辑 gedit a.c25、当前的系统进程查看命令 ps ps -aux 显⽰包含所有其他使⽤者的进程 嵌⼊式⼀般为单⽤户 因此⼀般使⽤ps 就⾏ 具体请查看man ps26、进程实时运⾏状态查看命令 top27、⽂件类型查看命令 file ⼀般在ubuntu上编译arm上运⾏的软件 需要查看下编译后的⽂件类型 可执⾏⽂件会显⽰给x86 还是arm运⾏ file a.c⼆、ubuntu软件安装⽅法1、apt⼯具安装 (常⽤) sudo apt-get install 软件名称 sudo apt-get install git sudo apt-get install mplayer2、deb软件包安装 (⼤型图形界⾯软件) 在windows下安装为.exe⽂件 在ubuntu下则为.deb⽂件 可以直接双击安装 sudo dpkg -i 安装⽹易云⾳乐,3、源代码安装 (较少) (1)、百度下载tree源代码压缩包 (2)、解压 (3)、阅读readme 或install 查看如何安装 (4)、make 编译 (5)、sudo make install 安装 (6)、测试 tree --help 有些软件可能需要make config再安装4、app store5、其他安装⽅法QT安装 扩展名.run 得先安装IDE 百度三、Ubuntu⽂件系统结构 /bin 存放⼆进制可执⾏⽂件,这些命令在单⽤户模式下也能够使⽤。可以被root和⼀般的账号使⽤。 /boot Ubuntu内核和启动⽂件,⽐如vmlinuz-xxx。gurb引导装载程序。

/grub ⽤来启动ilnux vmlinux-4.15.0 linux内核⽂件 /cdrom 因该是⽤来放光盘中的⽂件 /dev 设备驱动⽂件 嵌⼊式开发时 设备的驱动⽂件存放位置 对设备进⾏操作也是通过⽂件进⾏操作 sda 磁盘⽂件 想写磁盘的话 直接对⽂件进⾏操作 /etc 存放⼀些系统配置⽂件,⽐如⽤户账号和密码⽂件,各种服务的起始地址。 profile⽂件 ⽤于存放环境变量的⼀些配置 /home 系统默认的⽤户主⽂件夹,⼀般创建⽤户账户的时候,默认的⽤户主⽂件夹都会放到此⽬录下。 zkh/

lib/ 系统运⾏所需库 x86_64-linux-gnu/

.so linux下的⼀些动态库 /lib 存放库⽂件 /media 此⽬录下放置可插拔设备,⽐如SD卡,或者U盘就是挂载到这个⽬录中。 zkh/ 查看可插拔设备 /mnt ⽤户可使⽤的挂载点,如果要挂载⼀些额外的设备,那么就可以挂载到此处。 hgfs/ 可⽤来与windows系统作为共享⽂件夹 /opt 可选的⽂件和程序存放⽬录,给第三⽅软件放置的⽬录。 /root root⽤户⽬录,也就是系统管理员⽬录。 /sbin 和/bin类似,也是存放⼀些⼆进制可执⾏⽂件。sbin下⾯的⼀般是系统开机过程中所需要的命令。 /snap 包管理⼯具 /srv 服务相关⽬录。⽐如⽹络服务。 /sys 记录内核信息,虚拟⽂件系统。 /tmp 临时⽬录 /var 存放⼀些变化的⽂件,⽐如⽇志⽂件 /usr usr不是user的缩写,⽽是UNIX Software Resource的缩写,存放与系统⽤户有关的⽂件,会占⽤很⼤的存储空间! /proc 虚拟⽂件系统,数据放置到内存中,存放系统运⾏信息 cat proc/cpuinfo 查看cpu信息四、ubuntu磁盘⽂件u盘格式设为FAT32 适合嵌⼊式linux1、ubuntu磁盘⽂件 /dev/sd*⽂件,此类⽂件是磁盘设备⽂件,并不能直接访问磁盘,必须要将磁盘挂载到某⼀个⽬录下才可以访问。 /dev/sdb和/dev/sdb1是U盘的设备⽂件。 /dev/sdb表⽰U盘,/dev/sdb1表⽰U盘的第⼀个分区。 cd /dev ls sd* 列出磁盘⽂件2、磁盘和⽬录的容量查询命令 df:列出⽂件系统的整体磁盘使⽤量。主要查看个⽂件系统的使⽤量, du:评估⽂件系统的磁盘使⽤量,主要查看单个⽂件的⼤⼩。 du -h 显⽰u盘下所有⽂件(包括⼦⽂件)的空间使⽤量 du -h --max-depth=1 只显⽰⼀层的⽬录空间使⽤情况3、磁盘挂载与卸载,分区和格式化、 1、磁盘的挂载和卸载 dev为设备的连接 media为挂载点 mount和umount命令 视频中没卸载成功 哈哈 打开了⽂件怎么会卸载成功呢 sudo umount ⽬录 ⽬录为/media/zkh/中的⽂件名 -f 强制卸载 不⽤也⾏ cd /media/zkh/ sudo mkdir 新建挂载点 挂载只能挂实际内容sdb1 不能sdb sudo mount /dev/sdb1 /media/zkh/udisk/ 将sdb1挂载到udisk⽂件夹下 -o iocharset=utf8 解决⽂件名中⽂乱码问题 不⽤也⾏ 2、磁盘分区 fdisk命令 sudo fdisk -l 查看磁盘分区 sudo fdisk /dev/sdb 进⼊操作帮助进⾏磁盘操作 p为主分区 e为可⽤空间 操作后需要保存 如果删除u盘分区则有时候需要把u盘卸载 创建中的扇区表⽰空间⼤⼩的区间 创建后有时候需要格式化才能挂载 3、磁盘格式化 磁盘分区创建好以后就可以格式化磁盘,使⽤命令mkfs。如: sudo mkfs -t vfat /dev/sdx -t 所安装的⽂件系统类型 分区后windows系统下就可以看到⼏个u盘分区 删除分区 windows下可以通过SDFormat软件将磁盘分区删除

也可以在linux下把分区删除在重新创建⼀个⼤的分区五、Linux下常⽤的压缩格式–help 查看各参数帮助信息1、Linux下常⽤的压缩扩展名有:.tar、.2、.。2、Windows下7ZIP软件的安装 安装7ZIP 因为Linux下很多⽂件是.bz2,.gz结尾的压缩⽂件,因此需要在windows下安装7ZIP软件。 可通过将⽂件压缩为tar后再压缩为23、gzip压缩⼯具 只会对⽂件进⾏压缩(能递归压缩⽂件夹) 不会进⾏打包 .gzip⼯具负责压缩和解压缩.gz格式的压缩包。 gzip xxx //压缩 a.c ⽂件会压缩为 gzip -d //解压缩 ⽂件会解压缩为a.c gzip对⽂件夹进⾏压缩 gzip -r xxx //对⽂件夹进⾏压缩 gzip -rd //对⽂件夹进⾏解压缩 gzip虽然可以对⽂件夹进⾏压缩,但是并不能提供打包的服务,只是对⽂件夹中的所有⽂件进⾏了单独的压缩。 对于⽂件夹来说并不压缩 只压缩⽂件夹下的⽂件。4、bzip2压缩⼯具 只会对⽂件进⾏压缩(不能递归压缩⽂件夹) 不会进⾏打包 和gzip类似,只是bzip2⼯具负责压缩和解压缩.bz2格式的压缩包。 bzip2 -z xxx //压缩 a.c ⽂件会压缩为2 bzip2 -d 2 //解压缩 2⽂件会解压缩为a.c5、tar打包⼯具 tar⼯具参数: -f,使⽤归档⽂件或 ARCHIVE 设备 使⽤归档的名字(⼀般放于最后) -c:创建新归档,创建压缩⽂件 -x:从归档中解出⽂件,解压缩 -j:使⽤bzip2压缩格式。 -z:使⽤gzip压缩格式 -v:打印出命令执⾏过程。 参数的顺序有要求 tar⼯具提供打包服务,就是将多个⽂件打包,⽐如 tar -vcf test //将test打包成 tar -vxf //解包 上⾯的tar命令只提供了打包和解包的功能,tar在提供打包和解包的同时使⽤gzip/bzip2进⾏压缩,实现类似windwos下winRAR软件的命令。

1、对.2进⾏压缩和解压缩 tar -vxjf 2 解压缩 tar -vcjf 2 xxx 压缩 2、对.进⾏压缩和解压缩 tar -vxzf //解压缩 tar -vczf xxx //压缩

6、其他格式的压缩和解压缩 1、.rar格式 查找帮助直接rar 不⽤--help 需要先安装rar:sudo apt-get install rar rar x //解压缩 rar a xxx //压缩 2、.zip格式 查找帮助直接rar 不⽤--help zip格式压缩使⽤“zip“命令: zip -rv xxx

zip格式解压缩使⽤“unzip”命令: unzip //解压⽂件 unzip -v //只查看压缩⽂件内容 不解压六、linux⽤户和⽤户组1、⽤户Linux是⼀个多⽤户操作系统,不同的⽤户拥有不同的权限。可以查看和操作不同的⽂件。 Ubuntu有三种⽤户:1、初次创建的⽤户。 2、root⽤户 3、普通⽤户。初次创建的⽤户权限⽐普通⽤户多,但是没有root⽤户多。 Linux⽤户记录在/etc/passwd这个⽂件内。 Linux⽤户密码记录在/etc/shadow这个⽂件内。 每个⽤户都有⼀个ID,叫做UID。2、⽤户组 为了⽅便管理,将⽤户进⾏分组。这样就可以设置⾮本组⼈员不能访问某些⽂件。每个⽤户可以属于多个不同的组。 ⽤户:家⾥有你、弟弟、妹妹个⼈,每个⼈都有⾃⼰的房间,你们三个⼈都是⽤户,你们都不能随便的乱翻别⼈的房间。 ⽤户组:你们三个都是⼀个家庭的,也就是属于同⼀个⽤户组,你们三个可以共⽤厨房,书房等空间。 ⽤户组为共享给组内⽤户公共资源 并不影响⽤户的私⼈资源 ⼀个⽤户可加⼊多个组 因此: ⽤户和⽤户组的存在就是为了控制⽂件的访问权限的。 每个⽤户组都有⼀个ID,叫做GID。 ⽤户组及⽤户信息存储在/etc/group⽂件中。 组名 密码 ID 包含的⽤户 ⽤户及⽤户组共⽤⼀套ID即 ⽤户和⽤户组排在同⼀ID序列中3、创建⽤户和⽤户组 (1)、图形化界⾯创建 要使⽤图形化界⾯创建⽤户和⽤户组的话就需要安装gnome-system-tools这个⼯具: sudo apt-get install gnome-system-tools (2)、命令创建⽤户和⽤户组 要加sudo 添加⽤户:adduser命令,adduser ⽤户名 ⽤户查询:finger命令,finger ⽤户名 修改⽤户密码:passwd命令,passwd ⽤户名 删除⽤户:deluser命令,deluser ⽤户名 添加⽤户组:addgroup命令,addgroup ⽤户组名 显⽰⽤户所属⽤户组:groups命令,groups ⽤户名 删除⽤户组:delgroup命令,delgroup⽤户组名

可通过修改⽤户权限、修改/etc/group、图形等⽅式把⽤户添加到⽤户组中 命令创建可以只有三位密码 图形不⾏ 修改密码只能在所在的⽤户中 或sudo七、Ubuntu/Linux⽂件权限1、⽂件权限是指不同的⽤户或⽤户组对某个⽂件拥有的权限,⽂件的权限分为三种:r: 读 w:写 x:可执⾏。 ⽂件描述形式如下: -rw-rw-r—就是⽂件权限,第⼀位表⽰⽂件类型,剩下的每三位表⽰⼀组权限。分别对应拥有者权限、拥有者所在组权限、其他⽤户权限。可以使⽤⼆进制表⽰⽂件权限。 r=4 w=2 x=1 a.c⽂件信息: --rw-rw-r--,a.c所属⽤户拥有读写权限⽆可执⾏权限。组内其他⽤户拥有读写权限⽆可执⾏权限,其他⽤户仅有可读权限。 zkh zkh ⽤户 ⽤户组 ls -l /dev列出⽂件的详细信息 列出的开头第⼀个字母为⽂件类型 b 块⽂件 c 字符⽂件2、Ubuntu/Linux⽂件权限修改 1、修改⽂件权限命令 chmod命令 777 开放所有权限 a 所有⽤户 u 归属⽤户 g 归属组 o 其他⽤户 w r x 权限 u+x 所属⽤户添加执⾏权限 chmod 777 ⽂件名 2、修改⽂件所属⽤户 chown命令

sudo chown root ⽂件名 将⽂件所属⽤户修改为root sudo chown .root ⽂件名 将⽂件所属组改为root sudo chown ⽂件名 ⽂件所属⽤户所属组⼀起修改为root sudo chown -R ⽂件夹 ⽂件夹中所有的⽂件⼀起修改 ⽂件中本⽤户⽆法执⾏ 组外⽤户可执⾏ 把⽂件所属⽤户调为组外⽤户 本⽤户即可执⾏所有⽤户都具有w权限时 ⽂件名会⾼亮gcc hello.c -o hello 编译c⽂件 输出hello为可执⾏⽂件⼋、linux连接⽂件Linux有两种连接⽂件:符号连接(软连接)和硬链接,符号链接类似Windows下的快捷⽅式。硬链接通过⽂件系统的inode连接来产⽣新⽂件名,⽽不是产⽣新⽂件。inode:记录⽂件属性,⼀个⽂件⼀个inode。inode相当于⽂件ID,查找⽂件的时候要先找到inode,然后才能读出⽂件的内容。⼆、ln命令 ln命令⽤于创建连接⽂件: ln [选项] 源⽂件 ⽬标⽂件 选项:-s 创建符号链接(软连接) -f 强制创建连接⽂件,如果⽬标存在,那么先删除掉⽬标⽂件,然后再建⽴连接⽂件。三、硬连接 硬链接是多个⽂件都指向同⼀个inode,硬链接知识点: ①、具有相同inode的多个⽂件互为硬链接⽂件,创建硬链接相当于⽂件实体多了⼊⼝。 ②、对于硬链接⽂件,只有删除了源⽂件以及对应的所有硬连接⽂件,⽂件实体才会被删除。 ③、根据硬链接⽂件的特点,我们可以通过给⽂件创建硬连接的⽅式来防⽌⽂件误删除。 ④、不论修改源⽂件还是连接⽂件,另⼀个⽂件的数据都会被改变。 (与源⽂件占⽤⼤⼩相同) ⑤、硬连接不能跨⽂件系统。 ⑥、硬连接不能连接到⽬录。 ln ⽂件名 连接⽂件名相当于把⽂件复制后相关联起来,⽅便多地操作因为以上这些限制,硬链接其实不常⽤。四、符号连接(软连接) 类似于指针 符号连接类似Windows下的快捷⽅式,符号链接也叫做软连接,软连接要⽤的多。符号连接相当于创建了⼀个独⽴的⽂件,这个⽂件会让数据读取指向它连接的哪个⽂件的⽂件名。软连接的特点: ①、可以连接到⽬录。 ②、可以跨⽂件系统。 ③、删除源⽂件以后,软连接⽂件也就“打不开了”。 ④、符号连接⽂件通过->来指⽰具体的连接⽂件。 ⑤、符号连接要使⽤绝对路径,否则连接出问题。 当cp的使⽤要⽤-d 且如果不是绝对路径 赋值后⽂件⽆效 cp的时候要把⽬录下保持所有⽂件的连接 就要-d 否则⽂件将复制 且链接⽂件要使⽤绝对路径

ln -s ⽂件绝对路径 连接⽂件名 绝对路径~也可使⽤之前jupyter操作⽬录下的其他地⽅的磁盘⽂件就是依照此原理⽂件类型为lll == ls -l -i 查看⽂件连接九、vim编辑器Linux系统都会⾃带vi编辑器,但是vi编辑器太难⽤了!所以建议⼤家安装vim编辑器,安装命令:sudo apt-get install vim1、vim编辑器三种⼯作模式 vi xxx 使⽤vi编辑器打开⽂件。 ⼀般模式(指令模式):默认模式,⽤vi打开⼀个⽂件以后⾃动进⼊到此模式。 编辑模式:⼀般模式中⽆法编辑⽂件,要编辑⽂件就要进⼊编辑模式,按下“i、I、a、A、o、O、s、r”等就会进⼊到编辑模式。⼀般按下“a”进⼊编辑模式。按下ESC键可退出编辑模式。 命令⾏模式(底⾏模式):先进⼊到⼀般模式,然后输⼊:、/、?这三个中的任意⼀个就可以进⼊到命令⾏模式。 /xxx,表⽰在⽂件中查找xxx 视频⽤a 不过个⼈习惯⽤i 详情可看开发板的开发⼿册 【注意】(不建议)如果不正常退出 可删除.⽂件名.swp 但之前编辑的⽂件内容也会删除

2、保存退出 当⽂件编辑好以后,输⼊:wq来保存退出。:q退出,:q!不保存退出,:w保存。 :q退出 修改后不保存或!的话退不出去 保存退出:wq 或:x3、其他操作⽅式 (1)、按下键盘上的上下左右键来控制光标。 ⼀般模式下: (1)、dd,删除光标所在⾏,ndd,删除光标所在⾏及其下n⾏。 (2)、u,撤销,恢复上⼀步。 (3)、. ,重复前⼀个操作。 (4)、yy,复制光标所在⾏ (5),nyy,复制光标所在向下n⾏,⽐如10yy就是复制光标下10⾏。 (6),p和P,p为复制到光标下⼀⾏,P复制到光标上⼀⾏。 (7)、屏幕上下移动 ctrl+f ctrl+b 上下翻⼀页 front back ctrl+d ctrl+u 上下翻半页 down up⼗、linux C编程可参考开发指南第三章1、编写C程序使⽤VIM编辑器编写程序,也可以使⽤vscode。1.1、设置vim编辑器 设置vim编辑器,⼀个TAB=4个字节。 sudo vi /etc/vim/vimrc 最后输⼊ set ts=4 设置vim编译器,显⽰⾏号。 set nu 1.2、编写C程序2、编译C程序

使⽤gcc编译器编译C程序。 编译单个⽂件 gcc -v ⽀持x86 可在x86电脑上编译arm的⽂件 gcc --help gcc 默认编译连接为可执⾏⽂件 ⽣成.out⽂件 -o 输出⽂件名 -O 优化编译 可通过-o指定⽂件名 -O2 更深层优化 可通过-o指定⽂件名 -v 查看过程 详细信息查看开发⼿册 编译流程:预处理(宏) -> 汇编 -> 编译 -> 链接 多个⽂件时 ⽣成.o ⽤于makefile编译 gcc main.c calcu.c input.c -o main

gcc -c main.c gcc -c calcu.c gcc -c input.c gcc main.o calcu.o input.o -o main 这样修改了哪个就可以只重新编译哪个为o3、make⼯具和Makefile⽂件 编译整个⼯程⽂件 当源码⽂件⽐较多的时候就不适合通过直接输⼊gcc命令来编译,这时候就需要⼀个⾃动化的编译⼯具. make:⼀般说GNU Make,是⼀个软件,⽤于将源代码⽂件编译为可执⾏的⼆进制⽂件, make⼯具主要⽤于完成⾃动化编译。make⼯具编译的时候需要Makefile⽂件提供编译⽂件。 实现⾃动化编译 且可只编译修改项的相应⽂件 避免不必要的编译 Makefile(makefile):make⼯具所使⽤的⽂件,Makefile指明了编译规则。 ⽣成(⽬标):需要(依赖) 执⾏ main:main.o input.o calcu.o gcc -o main main.o input.o calcu.o main.o:main.c gcc -c main.c input.o:input.c

gcc -c input.c

calcu.o:calcu.c

gcc -c calcu.c

clean: rm *.o rm main

执⾏ make

make clean makefile编译规则详情看开发指南 编写⼀个⼩型的含有多个.c⽂件的C程序。⼗⼀、Makefile的基本语法变量要声明为全局1、Makefile中的变量为字符串 可通过变量代替较长的依赖 objects = main.o input.o calcu.o main: $(objects) gcc -o main $(objects) ...

name = zkh curname = $(name) name = zkh2 print: @echo $(curname) 输出zkh2 Makefile中变量的值取决于他所引⽤的变量最后⼀次的有效值 可通过:=来赋值 类似正常=赋值 = 如果前⾯没有被赋值 则赋值 否则使⽤前⾯的赋值 += 在字符串后⾯添加2、shell命令前加@不将执⾏过程显⽰出来 也可不加3、通配符% ⾃动化变量 ⽤于批量编译

⽬标%中的内容取决于依赖%中的值 %.o:%.c gcc -c $< 命令 $@ 规则中的⽬标集合,在模式规则中,如果有多个⽬标的话,“$@”表⽰匹配模 式中定义的⽬标集合。 $% 当⽬标是函数库的时候表⽰规则中的⽬标成员名,如果⽬标不是函数库⽂件, 那么其值为空。 $< 依赖⽂件集合中的第⼀个⽂件,如果依赖⽂件是以模式(即“%”)定义的,那么 “$<”就是符合模式的⼀系列的⽂件集合。 $?

所有⽐⽬标新的依赖⽬标集合,以空格分开。 $^ 所有依赖⽂件的集合,使⽤空格分开,如果在依赖⽂件中有多个重复的⽂件, “$^”会去除重复的依赖⽂件,值保留⼀份。 $+

和“$^”类似,但是当依赖⽂件存在重复的话不会去除重复的依赖⽂件。 $* 这个变量表⽰⽬标模式中"%"及其之前的部分,如果⽬标是 test/.c,⽬标模 式为 a.%.c,那么“$*”就是4、makefile伪⽬标 如clean 当⼯程中有名为clean的⽂件时就会执⾏失败 解决⽅法:将clean声明为伪⽬标 .PHONY:clean clean: ...5、makefile函数 不⽀持⾃定义函数 但有⾃带函数 具体详见光盘 -> 参考资料 -> 跟我⼀起写Makefile⼗⼆、shell脚本⼊门⼀、shell脚本⼊门我们已经能够熟练的在终端中输⼊命令来完成⼀些常⽤的操作,但是我们都是⼀条⼀条输⼊命令。这样会很⿇烦,那么有没有⼀种⽅式可以将很多条命令放到⼀个⽂件⾥⾯,然后直接运⾏这个⽂件即可?肯定有,这个就是shell脚本!shell脚本类似windows的批处理⽂件,shell脚本就是将连续执⾏的命令写成⼀个⽂件。shell脚本提供数组、循环、条件判断的等功能。shell脚本⼀般是Linux运维或者系统管理员要掌握的,作为嵌⼊式开发⼈员,只需要掌握shell脚本最基础的部分即可。⼆、shell脚本写法 shell脚本是个纯⽂本⽂件,命令从上⽽下,⼀⾏⼀⾏的开始执⾏。shell脚本扩展名为.sh。 shell脚本第⼀⾏⼀定要为: #!/bin/bash 表⽰使⽤bash。三、shell脚本语法 3.1第⼀个shell脚本

⼀般shell脚本⽂件需要添加执⾏权限 默认没有执⾏的权限 #!/bin/bash echo "hello world" 3.2、交互式shell脚本 read。 #!/bin/bash echo "input your name:" read name

echo "yourname:" $name

这中间不能加+ #!/bin/bash read -p "input your age and weight" age weight echo "your age=$age and weight=$weight" 3.3、shell脚本的数值计算 shell仅⽀持整形,数值计算使⽤$((表达式))。 #!/bin/bash echo "input two num:" read -p "first num" first read -p "second num " second total=$(($first+$second)) //加号两边加空格⽆影响 变量的赋值=两边不能有空格 echo "$first + $second = $total" 3.4、test命令 test命令⽤于查看⽂件是否存在、权限等信息,可以进⾏数值,字符,⽂件三⽅⾯的测试。 &&和||命令: cmd1 && cmd2 当cmd1执⾏完并且正确,那么cmd2开始执⾏,如果cmd1执⾏完毕错误,那么cmd2不执⾏。 cmd1 || cmd2 当cmd1执⾏完毕并正确,那么cmd2不执⾏,反之cmd2执⾏。

//查找⽂件是否存在 #!/bin/bash echo "input filename" read -p "filename" filename test -e $filename && echo "$filename exist" || echo "$filename not exist" //查看字符串是否相等 #!/bin/bash echo "input two string" read -p "firststring" firststr read -p "secondstring" secondstr

test $firststr == $secondstr && echo "firststring == secondstring" || echo "firststring != secondstring" 3.5、中括号[]判断符 [ ] ==或 != 输⼊前后加空格 ⽆论是否为变量 都需要加双引号 [ "$firststr" == "$secondstr" ] =两边空格不能少 不然会出错 多了倒是不会报错 //判断字符串是否相等 #!/bin/bash echo "input two string" read -p "firststring" firststr read -p "secondstring" secondstr

[ "$firststr" == "$secondstr" ] && echo "firststring == secondstring" || echo "firststring != secondstring" 3.6、默认变量 $0~$n,表⽰shell脚本的参数,包括shell脚本命令本⾝,shlle脚本命令本⾝为$0 $#:#表⽰最后⼀个参数的标号。 $@:表$1、$2、$3...... #!/bin/bash echo "file name: " $0 //根据执⾏⽂件时的路径来决定 是否是绝对路径或相对路径 各⾃输出不同 echo "num of param: " $# echo "whole param: " $@ echo "first param: " $1 echo "second param: " $2四、shell注释⽅式 单⾏ # 多⾏ 两处注释符号需要独⽴⼀⾏ 两者缺⼀不可 :<

"-h") help ;; "-c") close ;; *) echo "input can not identify" esac #!/bin/bash print(){ echo $1 $2 //$0与⽂件相同 但$1 开始为局部变量并不继承⽂件$1等 ⽆值则忽略 } print $1 $2七、shell循环 shell脚本也⽀持循环,⽐如 while do done,表⽰当条件成⽴的时候就⼀直循环,直到条件不成⽴。 输出未定义空变量不会报错

while [条件] //括号内的状态是判断式 do //循环开始 //循环代码段 done #!/bin/bash while [ "$value" != "close" ] do read -p "input string:" value done echo "stop while" 还有另外⼀种until do done,表⽰条件不成⽴的时候循环,条件成⽴以后就不循环了,写法如下: until [条件] do //循环代码段 done for循环,使⽤for循环可以知道有循环次数,写法 for var in con1 con2 con3…… do //循环代码段 done #!/bin/bash for name in zkh zkh1 zkh2 zkh3

do echo $name done for循环数值处理,写法 for((初始值; 限制值; 执⾏步长)) do //循环代码段 done #!/bin/bash read -p "input count: " count total=0 for((i=0;i