写点什么

嵌入式 Linux 入门(三、Linux Shell 及常用命令说明)

作者:矜辰所致
  • 2022-10-23
    江苏
  • 本文字数:6395 字

    阅读完需:约 21 分钟

嵌入式 Linux 入门(三、Linux Shell 及常用命令说明)
嵌入式 Linux入 门第三课,熟悉掌握 Linux 常用 Shell 命令  ...... 矜辰所致.. 更新Shell echo 命令              
复制代码


前言

认识了 Linux 文件系统,了解了文件结构和类型,那么就要学习对文件的操作了。学习 Linux ,必须要熟练的掌握 Linux 下的 Shell 命令。


本文我们就来学习说明一下 Linux 中的 Shell 及常用命令。


嵌入式 Linux 入门系列博文:

嵌入式 Linux 入门(一、Linux 基本介绍及文件结构)

https://xie.infoq.cn/article/1adbc03be480d8203f8b1ed4a

嵌入式 Linux 入门(二、Linux 文件系统、文件类型及权限管理)

https://xie.infoq.cn/article/4d2e926fda47f2eff019ae0e4

一、Shell 基本说明

1.1 Shell 是什么

在 Linux 中,Shell 是一个应用程序 ,他是用户与 Linux 内核沟通的桥梁。


它负责接收用户输入的命令,根据用户的输入找到其他程序并运行,Shell 负责将应用层或者用户输入的命令传递给系统内核,由操作系统内核来完成相应的工作,然后将结果反馈给应用层或者用户。


比如我们输入“ls” 并回车时,Shell 程序找到 “ls” 程序并运行,把结果打印出来。


Shell 有很多种实现,我们最常用为 bash ,在上一篇文章我们介绍用户的时候,查看用户的信息时候可以看到,他们的默认 Shell 都是 /bin/bash :



如何理解这个 Shell 有很多种实现方式呢?


就好比在 Windows 开发环境下面,我使用的 Vscode 中,不同的终端对应的其实是不同的 Shell 一样,如下图:



1.2 Shell 与 终端(terminal)

在 linux 下我们使用组合键 ctrl+alt+T 终端 输入命令,那么 Shell 是不是就是终端呢 ?


它们是两个东西 ,终端的作用是提供一个命令的输入输出环境 。 Shell 是一个命令行解释器。


只不过当我我们打开一个 terminal 的时候,通过用户默认的 Shell 设置,系统会将 terminal 和 Shell 关联起来,当我们在 terminal 中输入命令后,Shell 就负责解释命令。

1.3 Shell 与 图形化界面

在我们使用 Windows 的时候,基本上都是通过图形化界面来进行操作运行,图形话界面的特点是简单,通俗易懂,用鼠标指哪打哪。 使用图形化界面能让用户获得很好的体验。


在现在发型版本的 Linux 系统中,基本上图形化界面也做得越来越好,程序也越来越丰富,我们虚拟机安装的 Ubuntu 完全可以按照 Windows 的习惯进行图形化鼠标操作,基本上不用额外的学习,就可以正常的使用把 Ubuntu 系统使用起来。


既然图形化界面这么好了,为什么我们还要花费时间和力气去记住各式各样的命令?

为什么 Linux 一定要学命令行?

虽然 图形化界面 很友好易学,但是作为开发者我们在以后学习工作中并不是永远有图形化界面。


比如现在很多服务器都是 Linux 操作系统,但是基本上都不会配置显示器,维护人员都是通过远程登录进行维护操作。


比如我们做嵌入式,很多嵌入式产品并没有带显示屏,那么在其上面运行的 Linux 我们调试也是需要命令行。


再者,在 Linux 中几乎所有的程序都可以使用命令行执行,而且不是所有的应用程序都提供了图形化界面。

1.4 Linux 命令的提示符

我们打开终端,可以看到如下的提示符:


qzh@ubuntu:~$ 
复制代码


我们每行的命令前面都会有这样的提示符,我们简单说明一下这个提示符:



我们简单来测试看一下:



1.5 绝对路径与相对路径

在介绍命令之前,介绍一下 Linux 中的绝对路径 和相对路径,一个文件所处的位置可以用路径表示,在 Windows 下,我们可以通过属性来看到文件的路径,如下图:



绝对路径


在 Linux 中,从根目录下出发可以找到任意目录、任意文件,Linux 下的根目录为“/”。


从根目录开始表示目录或文件的方法称为“绝对路径”。


比如:


/home/qzh/bin/pwd
复制代码


相对路径


相对路径需要理解,是相对而言来说的,路径的写法不是由根目录 / 写起,需要有一个参考路径,怎么理解呢?


就是比如,当前正在某个目录下面,我们可以直接进入该目录下的某个文件夹:



在 Linux 中,使用 "." 表示当前路径," .." 表示上一级路径, "../.." 表示上上级目录:



二、Linux 常用命令

☆ 对于初学者,命令能记住最好,记不住也没关系,关键在于多用多体验,多得多了自然就记住了。 命令行不是背出来的而是用出来的!☆


我们只需掌握常用的命令,剩下的不知道的我们在遇到的时候可以查看 系统帮助,或者前辈们的文章笔记之类。


本文也不是把全部常用命令列出来,现在只是把常用的列举,在后期应该会对本文进行维护更新。



2.1 目录与文件操作命令

2.1.1 pwd

pwd
复制代码


pwd 命令,显打印当前工作目录的绝对路径,不需要任何参数:



2.1.2 ls

ls 命令,显示指定目录下的内容,可带参数可不带参数。


ls    [选项]    [路径] 
复制代码


它的主要参数有:

-a 显示所有的文件以及子目录,包括以“.”开头的隐藏文件。

-l 显示文件的详细信息,比如文件的形态、权限、所有者、大小等信息。

-t 将文件按照创建时间排序列出。

-A 和-a 一样,但是不列出“.”(当前目录)和“..”(父目录)。

-R 递归列出所有文件,包括子目录中的文件。


Shell 命令里面的参数是可以组合在一起用的,比如组合“-al”就是显示所有文件的详细信息,包括以“.”开头的隐藏文件。



2.1.3 cd

cd 命令,切换路径。


cd    [路径] 
复制代码


我们最常用的一个命令,在文章前面“ 1.5 绝对路径与相对路径” 中我们已经有过示例,我们可以使用绝对路径或者相对路径进行操作。


要记录的几个路径:

" / " 根目录

" ~ " 当前用户主目录

" . " 表示当前路径

" .. " 表示上一级路径

" ../.. " 表示上上级目录



2.1.4 mkdir

mkdir 命令,创建目录。


mkdie [-p]  [目录]
复制代码


主要参数如下:

-p 如所要创建的目录其上层目录目前还未创建,那么会一起创建上层目录。



2.1.5 touch

touch 命令,修改文件时间,如果文件不存在则创建空文件。


touch  [参数]  [文件名] 
复制代码


使用 touch 创建文件的时候,如果[文件名]的文件不存在,那就直接创建一个以[文件名]命名的文件,如果[文件名]文件存在的话就仅仅修改一下此文件的最后修改日期。


它的主要参数有:

-a 只更改存取时间。

-c 不建立任何文件。

-d<日期> 使用指定的日期,而并非现在日期。

-t<时间> 使用指定的时间,而并非现在时间。


一般使用来说,我们用它基本都是是用来创建一个新文件。



2.1.6 rmdir

rmdir 命令,删除目录。


rmdir [参数] [文件夹(目录)] 
复制代码


它的主要参数有:-p 删除指定的文件夹(目录)以后,若上层文件夹(目录)为空文件夹(目录)的话就将其一起删除。



2.1.7 rm

rm 命令,删除文件或目录。


rm    [参数]  [目的文件或文件夹目录名] 
复制代码


此命令可以完成删除一个文件或者多个文件及文件夹,它可以实现递归删除。对于链接文件,只删除链接,原文件保持不变。链接文件其实就类似 Windows 下的快捷方式文件。


它的主要参数有:

-d 直接把要删除的目录的硬连接数据删成 0,删除该目录。

-f 强制删除文件和文件夹(目录)。

-i 删除文件或者文件夹(目录)之前先询问用户。

-r 递归删除,指定文件夹(目录)下的所有文件和子文件夹全部删除掉。

-v 显示删除过程。



2.1.8 cp

cp 命令,复制文件或目录。


cp    [参数]  [源地址]    [目的地址] 
复制代码


它的主要参数有:

-a 此参数和同时指定“-dpR”参数相同

-d 在复制有符号连接的文件时,保留原始的连接。

-f 强行复制文件,不管要复制的文件是否已经存在于目标目录。

-I 覆盖现有文件之前询问用户。

-p 保留源文件或者目录的属性。

-r 或-R 递归处理,将指定目录下的文件及子目录一并处理


要想用好这个命令需要多测试测试。



2.1.9 mv

mv 命令,文件移动命令。


mv  [参数]  [源地址]    [目的地址] 
复制代码


它的主要参数有:

-b 如果要覆盖文件的话覆盖前先进行备份。

-f 若目标文件或目录与现在的文件重复,直接覆盖目的文件或目录。

-I 在覆盖之前询问用户。



2.1.10 cat

cat 命令,串联文件的内容并打印出来。


cat   [选项]  [文件] 
复制代码


虽然 cat 也有选项可加,但是我们一般使用都不加选型,直接使用 cat 文件名,而且我们一般使用就把他当成文本查看器就行了。



2.1.11 find

find 命令,用于在目录结构中查找文件。


find    [路径]  [参数]  [查找条件] 
复制代码


它的主要参数有:

-name "filename" 按照文件名称查找,查找与 filename 匹配的文件,可使用通配符。

-depth 从指定目录下的最深层的子目录开始查找。

-gid<群组识别码> 查找符合指定的群组识别码的文件或目录。

-group<群组名称> 查找符合指定的群组名称的文件或目录。

-size<文件大小> 查找符合指定文件大小的文件。

-type<文件类型> 查找符合指定文件类型的文件。

-user<拥有者名称> 查找符合指定的拥有者名称的文件或目录。


如果没有指定查找目录,则为当前目录。



2.1.12 grep

grep 命令,是查找文件中符合条件的字符串。


grep [选项] [查找模式] [文件名]
复制代码


它的主要参数有:

-b 在显示符合关键字的那一列前,标记处该列第 1 个字符的位编号。

-c 计算符合关键字的列数。

-d<进行动作> 当指定要查找的是目录而非文件时,必须使用此参数!否则 grep 指令将回报信息并停止搜索。

-i 忽略字符大小写。

-v 反转查找,只显示不匹配的行。

-r 在指定目录中递归查找。-n 显示所在的行号。


grep 命令一次只能查一个关键字, 这个查找字符串的命名得自己多多尝试。



2.2 文件权限和属性

文件权限和属性,我们在上一篇文章


《嵌入式 Linux 入门(二、Linux 文件系统、文件类型及权限管理)》


我们已经讲过了 chmod 改变文件权限 和 chown 改变文件所有者,具体可以查看上一篇文章,我们这里再次简单做个记录。

2.2.1 chmod

chmod 命令,改变文件权限。


chmod  [参数]  [文件名/目录名] 
复制代码



2.2.2 chown

chown 命令,改变文件所有者。


chown  [参数]  [用户名.<组名>]  [文件名/目录] 
复制代码



2.2.3 chgrp

chgrp 命令,改变文件所属用户组。


chgrp [参数] [所属群组] [文件名/目录]
复制代码



☆ 改变文件所有者和用户组的这两个命令的应用场景:复制文件,由于复制行为会复制执行者的属性和权限,因此复制后需要改变文件所属用户、用户组等。

2.2.4 sudo

sudo 命令,以系统管理者的身份执行指令。


这个我们在前面文章多多少少也遇到过,就是在进行某些操作权限不够的时候,在命令前面加上 sudo ,以管理员身份运行。


系统会提示你输入密码,你输入密码是不会显示的。



2.3 压缩与解压缩

2.3.1 zip

zip 命令,用于将一个或者多个文件压缩成一个.zip 结尾的文件,命令格式如下:


zip   [参数]    [压缩文件名.zip]    [被压缩的文件] 
复制代码


它的主要参数有:

-b<工作目录> 指定暂时存放文件的目录。

-d 从 zip 文件中删除一个文件。

-F 尝试修复已经损毁的压缩文件。

-g 将文件压缩入现有的压缩文件中,不需要新建压缩文件。

-h 帮助。-j 只保存文件的名,不保存目录。

-m 压缩完成以后删除源文件。

-n<字尾符号> 不压缩特定扩展名的文件。

-q 不显示压缩命令执行过程。

-r 递归压缩,将指定目录下的所有文件和子目录一起压缩。

-v 显示指令执行过程。

-num 压缩率,为 1~9 的数值。



2.3.2 unzip

unzip 命令用于对 .zip 压缩文件进行解压。


unzip  [参数]  [压缩文件名.zip] 
复制代码



2.3.3 gzip

gzip 命令,也是将压缩和解压缩集合在一起。


gzip [参数] [文件或者目录]
复制代码


它的主要参数有:

-l(list) 列出压缩文件的内容。

-k(keep) 在压缩或解压时,保留输入文件。

-d(decompress) 将压缩文件进行解压缩。


如果 gzip 不加任何选项,此时为压缩,压缩完该文件会生成后缀为.gz 的压缩文件,并删除原来的文件,推荐使用 gzip -k 来压缩源文件,这样会保留原来的文件。


相同的文件内容,如果文件名不同,压缩后的大小也不同。


gzip 只能压缩单个文件,不能压缩目录。



2.3.4 tar

tar 命令,将压缩和解压缩集合在一起。


Linux 下最常用的.bz2 和.gz 这两种压缩格式,可以使用 tar 命令压缩与解压。


tar  [参数]  [压缩文件名]    [被压缩文件名] 
复制代码


它的主要参数有:

-c(create):表示创建用来生成文件包 。

-x:表示提取,从文件包中提取文件。

-t:可以查看压缩的文件。

-z:使用 gzip 方式进行处理,它与”c“结合就表示压缩,与”x“结合就表示解压缩。

-Z 用 tar 生成压缩文件,用 compress 压缩。

-j:使用 bzip2 方式进行处理,它与”c“结合就表示压缩,与”x“结合就表示解压缩。

-v(verbose):详细报告 tar 处理的信息。

-f(file):表示文件,后面接着一个文件名。

-C <指定目录> 解压到指定目录。

-w 遭遇问题时先询问用户。

-k 解开备份文件时,不覆盖已有的文件。

-m 还原文件时,不变更文件的更改时间。

-r 新增文件到已存在的备份文件的结尾部分。


在使用 tar 的时候,要记住两条指令:


tar -vcjf  1file.tar.bz2  1file.c  tar -vczf  1file.tar.gz   1file.c 
复制代码


-vcjf 表示创建 bz2 格式的压缩文件,-vczf 表示创建.gz 格式的压缩文件。


压缩:



解压:



2.4 网络命令

2.4.1 ifconfig

ifconfig 命令,查看网络、设置 IP。


它的主要参数有:

-a :显示所有网卡接口 up:激活网卡接口 down:关闭网卡接口 address:xxx.xxx.xxx.xxx,IP 地址


查看 IP 地址:



关闭打开网卡:


使用 ifconfig 网卡名字 down 关闭网卡,使用 ifconfig 网卡名字 up 打开网卡。



修改网卡 IP 地址:



2.4.2 ping

ping 命令,检测主机联网状态。


这个命令我们比较熟悉,在 Windows 系统中我们也用这个 ping 命令。



2.5 其他一些命令

2.5.1 echo

echo 命令,用于字符串的输出,在终端上打印一段文字,也可以把终端的变量内容打印出来。


echo string
echo " 字符串" echo 字符串echo $ 变量名
复制代码


使用 echo 命令时,带双引号和不带双引号的效果是一样的,使用引号时,要注意用英文符号。



2.5.2 clear

清除屏幕。

2.5.3 reboot

重启系统。

2.5.4 poweroff

切断电源,关机。

2.5.5 uname

显示操作系统类型:



2.6 磁盘管理

磁盘管理的命令,会单独使用一篇文章来说明,到时候完成磁盘管理讲解的文章再来这里更新指令。

三、命令使用小技巧

上面记录了一些 Shell 常用的命令,我们在使用命令行的过程中,其实还有几个小技巧,学会这几个小技巧可以使得我们在使用命令行的过程中更加方便快捷。

3.1 自动补全功能

自动补全功能就是,只需要输入命令的前面一部分字母,然后按下 Tab 键,如果只有一个命令匹配的话就会自动补全这个命令剩下的字母。


如果按一下 Tab 键没有反应,说明有多个命令匹配,需要再按一下 Tab 键,系统会把所有匹配的命令列举出来。


当然,一个命令输入的字母越多,越容易自动补全,比如 ifconfig ,只输入 i 就按下 Tab 键,这想都不用想,i 开头的指令肯定很多,肯定不能自动补全到 ifconfig ,如果输入到 if 按 一下 Tab 键,也无法自动补全,因为以 if 开头的指令也有多种,直到我们输入 ifc ,然后再按一下 Tab 键,它就完全的会自动补全到 ifconfig。


示例如图:




自动补全功能不仅对命令适用,对文件目录也是一样,其实想想也能明白,Linux 一切皆文件,命令也是文件,所以可以理解为自动补全对 Linux 所有文件都适用。


举个例子如图:



3.2 重复输入功能

我们在终端输入指令的时候,有时候需要重复输入 或者 输入前面几条输入过的命令,可以使用键盘方向键,向上找到最近的输入的指令:



我们在有些开发的时候,需要重复的输入某些指令长指令,如果使用此技巧可以大大的节约时间。


当然,除了键盘上的方向键,还有一种方式,可以重复上一次的指令,但是也只能重复上一次的指令,就是用两个感叹号命令 “!!”,示例如图:



使用感叹号,只能重复上一次指令,这样看起来还不如我们使用方向键 快捷,那么它在什么时候比较合适呢?


就是在有些时候没有权限的时候,需要加上 sudo 指令的情况下,使用:


sudo !!
复制代码


举个例子,如下图:



使用此种方法,以后再系统中安装软件的时候,会很方便,因为安装软件大多需要获取管理员权限。

结语

本文我们开始学习了很多的 Shell 指令,对于入门者来说,一下子记住这么多感觉会很不友好,正如我文中说过的,记不住没有关系,linux 的学习一定要自己多动手,Shell 命令自己多敲一敲,自然而然的就记住了。


文中也没有把所有嵌入式开发需要的命令全部列举,对于一些某些部分专用的命令,比如磁盘管理相关,我们会在后面的对应部分文章进行说明讲解。


☆ 最后还是再次强调,命令行不是背出来的而是用出来的。☆


本文就到这里,谢谢大家!

发布于: 2022-10-23阅读数: 44
用户头像

矜辰所致

关注

CSDN、知乎、微信公众号: 矜辰所致 2022-08-02 加入

不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开! 为了活下去的嵌入式工程师,画画板子,敲敲代码,玩玩RTOS,搞搞Linux ...

评论 (2 条评论)

发布
用户头像
博主下一次可以把图片CSDN logo去一下,方便推荐
2022-10-23 21:54 · 北京
回复
好的,感谢提醒,待会我把尝试把文章图片处理一下,上次也有人给我提过了
2022-10-24 09:30 · 江苏
回复
没有更多了
嵌入式 Linux 入门(三、Linux Shell 及常用命令说明)_Linux_矜辰所致_InfoQ写作社区