本篇文章给大家带来了linux操作系统基础知识,其中包括程序开发环境、常用命令以及环境变量的相关知识,希望对大家有帮助。
1、Linux简介与程序开发环境
1.1 什么是Linux?
Linux是一个可以自由发布的类UNIX内核实现,它是一个操作系统的底层核心。Linux是由芬兰赫尔辛基大学的Linus开发,期间得到了网上广大UNIX程序员的帮助。它最初是受其教授的Minix(一个小型的类UNIX系统)启发而开发的程序,纯属个人的爱好,但是后来它自身逐步发展成为一个完整的系统
要理解什么是Linux,首先要了解在Linux之前诞生的系统和应用程序——UNIX和GNU软件。
1.1.1 什么是UNIX?
UNIX操作系统最初是由贝尔实验室开发的,当时的贝尔实验室是电信巨头AT&T(美国电报电话公司)旗下的一员。如今,它已经成为一种非常流行的多用户、多任务操作系统。UNIX操作系统可以运行在大量不同种类的硬件平台上,其适用范围从PC机到多处理器服务器和超级计算机。
在UNIX上进行程序开发有些典型的风格和特点:
1)简单性:许多很有用的UNIX工具是非常简单的。“小而简单”是一种值得学习的技术。越大、越复杂的系统注定会包含越大、越复杂的错误。
2)集中性:让一个程序很好地执行一项任务好过把所有功能都堆在一起。功能臃肿的程序难于使用和维护,单一目标的程序更容易随着更好的算法被开发出来而得到改进。在UNIX中,当用户出现新的需求时,我们通常是把小工具组合起来完成更复杂的任务,而不是试图将一个用户期望的所有功能放在一个大程序里。
3)可重用的组件:将应用程序的核心实现为库。具有简单而灵活的编程接口的库可以帮助其他人开发出同类程序,或者把这些技术应用到新的应用领域。
1.1.2 GNU项目和自由软件基金会
有了操作系统内核还不够,Linux能够发展到今天是无数人共同努力的结果。操作系统内核本身仅仅是可用开发系统的一小部分。一般的UNIX系统还包括提供系统服务和工具的应用程序,对于Linux系统,这些程序是由许多程序员编写并自由发布的。
Linux社区支持自由软件的概念,即软件本身不应受限,它们遵守GNU(GNU是GNU’s Not UNIX的递归缩写)通用公共许可证(GPL)。
自由软件基金会(Free Software Foundation)是由Richard Stallman创立,其宗旨是:试图创建一个与UNIX系统兼容,但并不受UNIX名字和源代码私有权限制的操作系统和开发环境。
GNU项目已经为软件社区提供了许多UNIX系统上应用程序的仿制品。例如大名鼎鼎的:
GCC:GNU编译器集,它包括GNU C编译器。
G++:G++编译器,是GCC的一部分。
GDB:源代码级的调试器。
GNU make
bash:命令解释器(shell的一种)
有了这些可用的自由软件,再加上Linux内核,我们可以说:创建一个GNU的、自由的类UNIX系统的目标已经通过Linux系统实现了。由于GNU软件做出的贡献,现在许多人通常把Linux系统称为GNU/Linux。
1.2 程序开发环境
工欲善其事必先利其器,想要进行Linux程序开发需要先搭建开发环境。
1.2.1 Linux环境安装
进行 Linux 开发需要安装一个 linux 系统环境,一般使用 VMWare 安装Ubuntu 系统进行开发。具体安装过程大家可以参考以下帖子https://zhuanlan.zhihu.com/p/38797088这里我就不做过多介绍。
1.2.2 SSH
Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。传统的网络服务程序,如 FTP、 Pop 和 Telnet 其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人攻击方式的攻击。
SSH 分为客户端 openssh-client 和服务器 openssh-server,我们需要在 ubuntu 系统下安装 ssh 服务器,以便使用 ssh 客户端登录到系统。
1)安装ssh
sudo apt update
sudo apt install openssh-server
2)启动ssh
sudo service ssh start
3)使用ip addr show
命令查看 ubuntu 系统 ip
可以看出,当前 ubuntu IP 地址为 192.168.176.148
4)测试 ssh 登录
在 Ubuntu 上安装完成 ssh 服务器后,接下来在 Windows 系统下使用 MobaXterm 进行连接,测试 ssh 服务器是否安装成功。 操作步骤如下:
运行 Xterm 软件,选择“Session”,如下图所示:
点击“SSH”并进行设置,如下图所示:
在该对话框中,选择“协议”为“SSH”, “主机名”为 ubuntu 的 IP 地址,用户名为当前用户名。端口号使用默认值 22。 设置完成后,点击"OK",出现如下命令行终端,表示已经连接上虚拟机的ubuntu系统。
通过这种方法,确定主机和开发板之间网络通讯正常后,即可以登录到开发板上。
5)安装 Visual Studio Code
Visual Studio Code(简称 VSCode)是微软出的一款免费的编辑器,有 Windows、 Linux 和 macOS 三个版本,是一款跨平台编辑器。 安装过程大家可以自行搜索,这里主要介绍用于C/C++程序开发的扩展包,安装步骤见下图:
常用的有如下插件需要安装:
C/C++。
C/C++ Snippets,即 C/C++重用代码块。
C/C++ Advanced Lint,即 C/C++静态检测 。
Code Runner,即代码运行。
Include AutoComplete,即自动头文件包含。
Rainbow Brackets,彩虹花括号,有助于阅读代码。
One Dark Pro, VSCode 的主题。
GBKtoUTF8,将 GBK 转换为 UTF8。
ARM,即支持 ARM 汇编语法高亮显示。
Chinese(Simplified),即中文环境。
vscode-icons, VSCode 图标插件,主要是资源管理器下各个文件夹的图标。
compareit,比较插件,可以用于比较两个文件的差异
DeviceTree,设备树语法插件。
Markdown Preview Enhanced, markdown 预览插件。
Maridown pdf,将.md 文件转换成其他格式。
2、Linux常用命令
Linux的命令有几百个,对于初学者来说,常用的并不多,并不需要全部掌握。在平时的学习和工作过程中,遇到了陌生的Linux命令,多查资料,日积月累,自然就记住了。下面为大家介绍Linux最基础的17个命令。
1、清屏
clear
2、查看服务器ip地址
ip addr
3、查看时间
date
4、目录和文件
文件系统像一棵树,树干是/(根)目录,树枝是子目录,树枝后面还有树枝(子目录中还有子目录),目录的最后是文件。
目录和文件的路径分为绝对路径和相对路径,绝对路径是从根(/)算起,例如/usr/etc/readme.txt。相对路径是从当前工作目录算起,如果当前工作目录是/usr,etc/readme.txt等同于/usr/etc/readme.txt。此外,需要注意的是:一个圆点.表示当前工作目录;两个圆点…表示当前工作目录的上一级目录。
下面为大家简单介绍Linux系统目录结构,为了避免诸多使用者对 Linux 系统目录结构天马行空,Linux 基金会发布了 FHS 标准。多数 Linux 发行版系统都遵循这一标准。注:FHS(Filesystem Hierarchy Standard),文件系统层次化标准,该标准规定了 Linux 系统中所有一级目录以及部分二级目录(/usr 和 /var)的用途。发布此标准的主要目的就是为了让用户清楚地了解每个目录应该存放什么类型的文件。
1)Linux 根目录(/)
FHS 认为,Linux 系统的根目录(/)最为重要,其原因有以下 2 点:
1. 所有目录都是由根目录衍生出来的;
2. 根目录与系统的开机、修复、还原密切相关;
因此,根目录必须包含开机软件、核心文件、开机所需程序、函数库、修复系统程序等文件,如下表所示。
2)Linux /usr目录
usr(注意不是 user),全称为 Unix Software Resource,此目录用于存储系统软件资源。FHS 建议开发者,应把软件产品的数据合理的放置在 /usr 目录下的各子目录中,而不是为他们的产品创建单独的目录。
Linux 系统中,所有系统默认的软件都存储在 /usr 目录下,/usr 目录类似 Windows 系统中 C:Windows + C:Program files 两个目录的综合体。
FHS 建议,/usr 目录应具备下表所示的子目录。
3)Linux /var 目录
/var 目录用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等。通常,此目录下建议包含如表 4 所示的这些子目录。
5、查看当前目录
pwd
6、改变当前工作目录
cd 目录名
示例:
1)进入/tmp目录
cd /tmp
2)进入上一级目录
cd ..
3)进入用户的主目录
cd
7、列出目录和文件信息
ls
是list的缩写,通过 ls
命令不仅可以查看目录和文件信息,还可以查看目录和文件的权限、大小、主人和组等信息。
选项 -l
列出目录和文件的详细信息。
示例:
1)列出当前工作目录下全部的目录和文件名信息
ls
2)列出当前工作目录下全部的目录和文件名详细的信息
ls -l
3)正则表达式
正则表达式又称规则表达式、通配符,目录和文件名都支持正则表达式,正则表达式的规则比较多,在这里我们只需要掌握最常用的两种:星号 “*” 。
星号 “*” :匹配任意数量的字符。
例如:ls open*.zip
8、创建目录
1)在当前工作目录下创建aaa目录
mkdir aaa
2)在当前工作目录下创建aaa目录,并在aaa目录下创建bbb目录
mkdir aaa/bbb -p
9、删除目录和文件
rm [-rf]
目录或文件
选项-r
可以删除目录,如果没有-r只能删除文件。
选项-f
表示强制删除,不需要确认。
1)删除aaa目录
rm aaa -r
2)强制删除当前工作目录下的ccc.c文件
rm -f ccc.c
9、移动目录和文件
mv 旧目录或文件名 新目录或文件名
1)把当前工作目录中的 book.c 文件重命名为 book1.c
mv book.c book1.c
2)如果OPC/test3是一个已经存在的目录,以下命令将把当前工作目录下的 book.c 文件移动到 OPC/test3 目录中。
mv book.c OPC/test3
3)如果 OPC/test3目录不存在,以下命令将把当前工作目录下的 book.c 文件改名为 OPC/test3。
mv book.c OPC/test3
10、复制目录和文件
cp [-r] 旧目录或文件名 新目录或文件名
注:-r 是递归的意思,英文 recursion
选项-r
可以复制目录,如果没有选项-r
只能复制文件。
示例:
1)把当前工作目录下的book1.c文件复制为book2.c
cp book1.c book2.c
2)把当前工作目录下的aaa目录复制为bbb
cp aaa bbb -r
3)把当前工作目录下的book1.c文件复制为aaa/book1.c
cp book1.c aaa/book1.c
cp book1.c aaa/.
以上两个命令的效果相同。
4)把当前工作目录下的aaa目录复制为/tmp/aaa
cp -r aaa /tmp/aaa
cp -r aaa /tmp/.
以上两个命令的效果相同。
11、判断网络是否连通
ping -c 包的个数 ip地址或域名
ping用于确定本地主机是否能与另一台主机成功交换数据包,判断网络是否通畅。
1)向本地主机(127.0.0.1)ping五个包
ping -c 5 127.0.0.1
2)向百度 www.baidu.com.cn 的服务器ping五个包
ping -c 5 www.baidu.com.cn
可以看出百度的服务器是可以ping
通的。
3)向谷歌 www.google.com 的服务器ping五个包。
ping -c 5 www.google.com
可以看出谷歌的服务器是ping
不通的。
12、显示文本文件的内容
显示文本文件的内容有三个命令:cat
、more
和tail
。
1)cat 命令
cat 文件名
cat命令一次显示整个文件的内容。
cat main.cpp
2)more 命令
more 文件名
为了方便阅读,more命令分页显示文件的内容,按空格键显示下一页,按b键显上一页,按q键退出。
3)tail 命令
tail -f 文件名
tail -f
用于显示文本文件的最后几行,如果文件的内容有增加,就实时的刷新。对程序员来说,tail -f
极其重要,可以动态显示后台服务程序的日志,用于调试和跟踪程序的运行。
13、统计文本文件的行数、单词数和字节数
wc(word count)功能为统计指定的文件中字节数、字数、行数,并将统计结果输出
wc 文件名
14、搜索文件中的内容
grep "内容" 文件名
注意,如果内容中没有空格等特殊字符,可以不用双引号括起来。
示例:
1)在main.cpp文件中搜索signal
grep signal main.cpp
15、搜索文件
1)find
find 目录名 -name 文件名
参数说明:
目录名:待搜索的目录,搜索文件的时候,除了这个目录名,还包括它的各级子目录。
文件名:待搜索的文件名匹配的规则。
示例:
从 OPC 目录开始搜索,把全部的 *.cpp 文件显示出来。
find OPC -name *.cpp
2)locate
locate 文件名
示例:
搜索open62541.c文件
locate open62541.c
注意:第一次使用该命令,可能需要更新数据库,按照提示的命令执行一下就好了.
find多用于在某个目录下进行模糊搜索,而locate则是进行全盘准确定位。
16、chmod命令
用于改变linux文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。
举例:ls -l example
第一列共有10个位置,第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。从第二个字符开始到第十个共9个字符,3个字符一组,分别表示了3组用户对文件或者目录的权限。权限字符用横线代表空许可,r代表只读,w代表写,x代表可执行。
常用参数:
-
-c 当发生改变时,报告处理信息
-
-R 处理指定目录以及其子目录下所有文件
权限范围:
-
u :目录或者文件的当前的用户
-
g :目录或者文件的当前的群组
-
o :除了目录或者文件的当前用户或群组之外的用户或者群组
-
a :所有的用户及群组
权限代号:
-
r :读权限,用数字4表示
-
w :写权限,用数字2表示
-
x :执行权限,用数字1表示
-
– :删除权限,用数字0表示
-
s :特殊权限
示例:
1)删除文件 example 所有用户可执行权限
chmod a-x example
2)给 example 的属主分配读、写、执行(7)的权限,给 example 的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限
chmod 751 example -c
3)将aaa目录及其子目录所有文件添加可读权限
chmod u+r,g+r,o+r -R text/ -c
17、查看系统磁盘空间
df [-h] [-T]
选项-h
以方便阅读的方式显示信息:
df -h
选项-T
列出文件系统类型:
df -h -T
3、Linux环境变量讲解
3.1 环境变量的概念
3.1.1 什么是环境变量?
程序(操作系统命令和应用程序)的执行都需要运行环境,这个环境是由多个环境变量组成的。
3.1.2 环境变量的分类
1)按生效的范围分类。
系统环境变量:公共的,对全部的用户都生效。
用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。
2)按生存周期分类。
永久环境变量:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
临时环境变量:使用时在Shell中临时定义,退出Shell后失效。
3)Linux环境变量
Linux环境变量也称之为Shell环境量变,以下划线和字母打头,由下划线、字母(区分大小写)和数字组成,习惯上使用大写字母,例如PATH、HOSTNAME、LANG等。
3.2 常用的环境变量
3.2.1 查看环境变量
1)env命令
在Shell下,用env命令查看当前用户全部的环境变量。
上图只截取了部分环境变量,并非全部。
注:用env命令的时候,满屏显示了很多环境变量,不方便查看,可以用grep筛选。
env|grep 环境变量名
例如查看环境变量名中包含PATH的环境变量。
env|grep PATH
2)echo命令
echo $环境变量名
例如:echo $LANG
3.2.2 常用的环境变量
1)PATH
可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序,PATH变量的具体用法本文后面的章节中有详细的介绍。
2)LANG
Linux系统的语言、地区、字符集。
echo $LANG
3)HOSTNAME
服务器的主机名。
echo $HOSTNAME
4)SHELL
用户当前使用的Shell解析器。
echo $SHELL
5)HISTSIZE
保存历史命令的数目。
6)USER
当前登录用户的用户名。
echo $USER
7)HOME
当前登录用户的主目录。
echo $HOME
8)PWD
当前工作目录。
echo $PWD
9)LD_LIBRARY_PATH
C/C++语言动态链接库文件搜索的目录,它不是Linux缺省的环境变量,但对C/C++程序员来说非常重要,具体用法本文后面的章节中有详细的介绍。
3.3 设置环境量
export 变量名='值'
如果环境变量的值没有空格等特殊符号,可以不用单引号包含。
示例:
export PATH=$PATH:.
以上命令为当前shell的环境变量PATH添加.目录(是.)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
以上命令为当前shell的环境变量LD_LIBRARY_PATH添加.目录
采用export设置的环境变量,在退出Shell后就会失效,下次登录时需要重新设置。如果希望环境变量永久生效,需要在登录脚本文件中配置。
3.3.1 系统环境变量
系统环境变量对全部的用户生效,设置系统环境变量有三种方法。
1)在/etc/profile文件中设置。
用户登录时执行/etc/profile文件中设置系统的环境变量。但是,Linux不建议在/etc/profile文件中设置系统环境变量。
2)在/etc/profile.d目录中增加环境变量脚本文件,这是Linux推荐的方法。
/etc/profile在每次启动时会执行 /etc/profile.d下全部的脚本文件。/etc/profile.d比/etc/profile好维护,不想要什么变量直接删除 /etc/profile.d下对应的 shell 脚本即可。
/etc/profile.d目录下有很多脚本文件,例如:
ls /etc/profile.d
3)在/etc/bashrc文件中设置环境变量。
该文件配置的环境变量将会影响全部用户使用的bash shell。但是,Linux也不建议在/etc/bashrc文件中设置系统环境变量。
3.3.2 用户环境变量
用户环境变量只对当前用户生效,设置用户环境变量也有多种方法。
在用户的主目录,有几个特别的文件,用ls
是看不见的,用ls .bash*
可以看见。
1).bash_profile(推荐首选)
当用户登录时执行,每个用户都可以使用该文件来配置专属于自己的环境变量。
2).bashrc
当用户登录时以及每次打开新的Shell时该文件都将被读取,不推荐在里面配置用户专用的环境变量,因为每开一个Shell,该文件都会被读取一次,效率肯定受影响。
3).bash_logout
当每次退出系统(退出bash shell)时执行该文件。
4).bash_history
保存了当前用户使用过的历史命令。
3.3.3 环境变量脚本文件的执行顺序
环境变量脚本文件的执行顺序如下:
/etc/profile->/etc/profile.d->/etc/bashrc->用户的.bash_profile->用户的.bashrc
同名的环境变量,如果在多个脚本中有配置,以最后执行的脚本中的配置为准。
3.4 重要环境变量的详解
1、PATH环境变量
可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。
1)PATH环境变量存放的是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录。
export PATH=目录1:目录2:目录3:…目录n:.
2)PATH缺省包含了Linux系统命令所在的目录(/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin),如果不包含这些目录,Linux的常用命令也无法执行(要输入绝对路径才能执行)。
示例:
ls /bin/ls
可以查看到ls
命令位于/bin目录下
此时我们执行命令 export PATH=
将PATH变量清空,再执行ls
命令,系统会提示找不到ls
命令。
采用绝对路径就可以使用,/bin/ls
为环境变量PATH添加/bin目录后,ls
也可以执行了。
3)如果PATH变量中没有包含圆点.,执行当前目录下的程序需要加./或使用绝对路径。
示例:
在当前目录下执行 example 命令,提示无法执行。
将圆点.添加到环境变量PATH之后,便可以执行了。
export PATH=$PATH:.
2、LD_LIBRARY_PATH环境变量
C/C++语言动态链接库文件搜索的目录,它不是Linux缺省的环境变量,但对C/C++程序员来说非常重要。
LD_LIBRARY_PATH环境变量存放的也是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录,与PATH的格式相同。
export LD_LIBRARY_PATH=目录1:目录2:目录3:......目录n:.
这个环境变量我们会在下次课讲解Linux静态库与动态库时详细介绍。
3.5 环境变量的生效
1)在Shell下,用export设置的环境变量对当前Shell立即生效,Shell退出后失效。
2)在脚本文件中设置的环境变量不会立即生效,退出Shell后重新登录时才生效,或者用source命令让它立即生效,例如:
source /etc/profile
3.6 应用经验
虽然设置环境变量的方法有多种,但是建议大家系统环境变量在/etc/profile.d目录中配置,用户环境变量在用户的.bash_profile中配置,不建议在其它脚本文件中配置环境变量,会增加系统运维的麻烦,容易出错。