- A+
引言
图形用户界面(GUI)让简单的任务更容易完成,命令行界面(CLI)使完成复杂的任务成为可能。
第一部分:Shell
本部分包括命令行基本语言,命令组成结构,文件系统浏览、编写命令行、查找命令帮助文档。
基础知识
基础操作方式
在Linux中,在图形界面中打开Terminal的快捷键是Ctrl+Alt+t。
在Terminal中,按键盘的上下箭头,可以出现曾经输入过的命令,默认500行。关闭Terminal后会保存。
按键盘的左右箭头可以实现输入字符时光标的切换,可以移动到用户正在编辑部分的任意位置。
在Terminal中,鼠标不可以制定光标位置,鼠标左键可以用于选中文本,右键可以进行复制黏贴(有的系统是显示选项卡,有的是直接复制黏贴操作)。
命令行中,会出现一行短文字,格式类似于ebd@ubuntu:~$
或[me@linuxbox ~]$
。解释一下,基本格式是"用户名@主机名 当前工作目录 权限符"。~代表用户的家目录。普通用户的权限符是$,如果变成超级用户,用户名变成root,权限符变成#
Linux基础知识
在Linux中,一切皆文件,文件没有后缀名,文件名和命令名对大小写敏感,文件名以.开头的文件是隐藏文件。
番外1:Ubuntu使用root登录GUI系统
安装Ubuntu后设定root密码及开机使用root用户登录:
CentOS,openSUSE等系统在安装系统过程中会有设置root密码的步骤,而Ubuntu没有此步骤。
在Ubuntu安装完毕后,在Terminal中输入sudo passwd -u root
,按提示设置密码后,切换为root用户,输入命令su
,输入密码,用户权限符由$变为#。
再安装vim文本编辑器,输入命令apt install vim
,按提示安装成功后,用vim打开vim /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
,按键盘INSERT键进行编辑,在下方加入代码
greeter-show-manual-login=true all-guest=false
按Esc解除编辑,按":wq"保存并退出。
接着用vim /etc/pam.d/gdm-autologin
,用vim编辑,在auth required pam_succeed_if.so user != root quiet_success
前加上#,备注起来;同理再用vim对vim /etc/pam.d/gdm-password
在auth required pam_succeed_if.so user != root quiet_success
前加上#,备注起来。
最后输入reboot进行重启,重启后就可以使用root进行开机图形用户界面登录了,开机用户名处选择未列出,用户名输出root,再输入密码即可。
番外2:Ubuntu搭建c++开发环境和vscode编辑器
从零开始学命令
体验命令行之使用date和cal,df和free
输入date命令可以显示系统当前的时间和日期;
输入cal命令可以显示当前月份的日历。
输入df命令可以查看磁盘剩余的数量;
输入free命令可以查看当前内存空闲的情况。
exit
输入exit命令,可以结束并关闭当前终端会话。
清屏
输入clear命令进行向下翻页;
输入reset命令进行历史内容清空;
输入printf ' 33c'
命令进行历史内容清空。
用户操作概要
reboot | 用于重启机器 |
poweroff | 用于关闭系统 |
useradd xxxx | 用于添加用户 |
su xxx | 用户将用户切换为xxx |
whoami | 查看当前用户 |
在Linux系统中,普通用户可以在没有其他用户时使用reboot进行重启,使用poweroff可以关机,有其他用户时可以按照提示操作。useradd命令可以进行新用户的创建。需要切换用户时,使用命令su NAME
切换到NAME用户,可以使用whoami命令来查看当前操作的用户名(其实每行前面的提示符就有)。
Q&A
Q:shutdown和poweroff和reboot的区别?
A:shutdown是poweroff和reboot的结合,参数-r表示reboot,-h表示poweroff
在root用户下,使用shutdown -r +10
表示在10分钟后重新启动系统,shutdown -h now
表示立即关机。
网络入门之ifconfig和ping
- ifconfig —— 列出网络相关信息
- ping IP/DNS —— 连接某个ip或网址
在Ubuntu系统中,如果提示没有此命令,首先通过sudo apt install net-tools
安装网络工具。安装完成后,可以使用ifconfig命令来查看网络相关信息。可以使用ping命令了解网络之间的连接情况。
除了网络设备和状态外,如果正确启动了can驱动和can卡,can设备状态也会列出。
虚拟机使用桥接网络后,利用Windows下的ipconfig和Linux下的ifconfig得到主机和虚拟机的ip地址,可以相互ping通。
文件系统中跳转
- ls —— 列出目录中的内容
- cd —— 更改当前目录
- pwd —— 打印出当前工作的目录位置
Linux的文件系统是一个树形结构,树根是根盘符(根节点),结点按照用户的需求,具有不同的深度。任何时候,用户都像置身迷宫之中。当用户打开一个Terminal时,默认位置在用户的家目录(~)中。使用普通用户登录Linux系统时,家目录及其子目录是唯一允许普通用户进行写操作的地方。
可以键入pwd命令来显示当前的工作目录(绝对路径);
可以用ls命令来列出当前目录下的所有文件和子目录(相对路径);
可以使用cd命令进行当前工作目录的更改(可输入绝对路径或相对路径)。
在Linux中,可以在输入命令后接上选项。一个相对完整的命令应该是这样的:command -options arguments
。
ls命令的选项如下表:
ls常用选项一览 | ||
选项 | 长选项 | 描述 |
-a | --all | 展示包括隐藏文件和隐藏目录在内的所有文件和目录 |
-d | --directory | |
-l | 以列表形式详细显示 | |
-h | --human-readable | 人性化展示 |
-r | --reverse | 以相反的顺序进行显示 |
-S | 按照文件大小排序 | |
-t | 按照修改时间排序 | |
-F | ||
-i | 列出文件或目录的索引号 |
ls长输出时的各字段含义
如drwxr-xr-x
,d表示此文件名是一个目录(d表示目录,-表示文件,l表示硬链接),后面9个字母是三组rwx,分别表示文件属主自己、文件属主所在用户组、其他用户是否能对此文件或目录进行读(r)、写(w)、运行(x),有字母表示有此权利,-表示没有此权利。
路径问题
路径可以分为绝对路径和相对路径。绝对路径始于根目录,紧跟着一个一个的子目录,直到达到所期望的目录或文件。 相对路径始于当前工作目录,表示目标文件或目标目录相对于当前工作目录的路径。
在相对路径中,./
表示当前目录,../
表示回到当前目录的上一级(父)目录。绝对路径默认从根目录开始,即第一个/
表示根目录。
研究操作系统
- ls —— 列出目录中的内容
- file —— 确定文件类型
- less —— 浏览文件中文本内容
在Linux中,文件是没有扩展名的,很难通过一个名字知道这个文件是个什么文件。在windows中,.png文件是一张图片,.dll文件是一个动态链接库,那怎么知道在Linux下,一个文件是什么类型的呢?
使用file命令,可以很清楚的知道文件的类型。不论文件名是否有后缀,都可以将文件的类型正确的识别。
输入命令less可以查看文本型文件的内容。可以看出,上图中的File_Rename是一段代码,是文本格式的文件,其他的一个是mp3文件,一个是png矢量图文件。使用命令less File_Rename
对此文本文件进行查看。在显示文本文件内容后,使用b进行向上翻页,使用空格进行向下翻页,使用上下箭头进行向上或向下一行的移动,使用q键进行退出,使用/键进行索引,使用n键进行/之后的下一次索引,使用G跳到最后一行,用g跳到第一行。
系统目录一览
/ | 根目录,根盘符。 |
/boot | 系统启动相关文件。 包含内核,RMA磁盘映像和启动加载程序。 |
/etc | 配置文件,包含一系列Shell脚本,系统启动时脚本会运行每个系统服务,是可读文本文件。 |
/dev | 包含设备结点的目录。内核维护着它支持的设备。 |
/home | 用户的家目录,用户家目录在/home/Username,普通用户只能在自己的目录下创建文件。 |
/root | 管理员的家目录。 |
/lib | 静态库文件和动态库文件,/lib/modules是内核模块文件。 |
/lost+found | 当部分恢复了一个损坏的文件才会用到的目录。 |
/media | 移动设备的自动挂载点目录,如光驱和USB驱动。 |
/mnt | 挂载点目录,是一个额外的临时文件系统。 |
/opt | 可选目录,第三方程序和软件产品的安装目录。 |
/proc | 内核映射文件,是一个伪文件系统,是内核的窥视孔,是只读的。 |
/sys | 跟硬件设备相关的属性映射文件,是一个伪文件系统。 |
/tmp | 临时文件,每次重新启动都会自动清空。还有/usr/tmp。 |
/var | 经常变化的文件,如数据库 假脱机文件 邮件等,/var/log是日志文件目录。 |
/bin | 用户命令,可执行文件;用到的库文件可能在/lib,配置文件在/etc |
/sbin | 管理命令,可执行文件;用到的库文件可能在/lib,配置文件在/etc |
/usr | 只读文件,其中/usr/local是第三方软件。 |
/usr/bin | 系统安装的可执行程序。 |
/usr/lib | 是/usr/bin目录中程序所用的库文件。 |
/usr/local | 让系统使用的程序的安装目录,默认为空。由源码编译的程序会在./bin下。 |
/usr/sbin | 包含系统管理程序。 |
/usr/share | 是很多由/usr/bin目录中程序使用的共享数据。 |
/usr/share/doc | 大多数系统中软件的文档所在地。 |
操作文件和目录
- cp —— 复制文件和目录
- mv —— 移动/重命名文件和目录
- mkdir —— 创建目录
- rm —— 删除文件和目录
- ln —— 创建硬链接和符号链接
在图形文件管理器中对上面列出的任务会更容易些,而命令行的程序优点在于对复杂文件任务的操作。
可以输入mkdir dir1在当前路径下创建一个名为dir1的目录,也可以在当前路径下一次创建多个目录,如mkdir dir1 dir2 dir3
;
可以输入 cp item1 item2将item1复制到item2,item要求是一个可以识别的路径,可以使文件或者目录;
可以输入 mv item1 item2将item1移动到item2,具体要求和cp命令类似;
可以输入rm item,将当前目录下的item进行删除;
(请注意:务必先用ls item将需要的item列出,正确后使用rm进行删除,以免错删造成麻烦!)
通配符
在Terminal中,可以按照名字,使用通配符进行匹配。通配符可以理解为另一个维度的正则表达式。利用通配符的规则,可以在指定的文件范围内正确匹配出满足通配条件的文件和目录。
通配符 | 含义 | 示例 |
* | 匹配任意长度的字符,包括0 1或多个 | a*.cpp 以a开头的以.cpp结尾的文件或目录 |
? | 匹配任意的单个字符 | RT?123456 RT和123456中间有一个字母的文件或目录 |
[ ] | 匹配括号中出现的单个字符 | |
[:upper:] [A-Z] |
匹配一个大写字母 | [:upper:]*[:digit:] 大写字母开头,数字结尾的文件活目录 |
[:lower:] [a-z] |
匹配一个小写字母 | |
[:alpha:] [a-Z] |
匹配一个字母,大小写均可 | |
[:digit:] [0-9] |
匹配一个数字字符 | |
[:alnum:] [A-Z,a-z,0-9] |
匹配一个数字或字母 | |
[^…] | 匹配…之外的一个字符 | |
[:blank:] | 匹配一个水平空白字符 | |
[:space:] | 匹配一个水平或垂直空白字符 | |
[:punct:] | 匹配一个标点 | |
[:print:] | 匹配一个可打印字符 | |
[:cntrl:] | 匹配一个不可打印字符 |
使用通配符,可以匹配出满足用户条件的文件和目录。
小技巧:多个命令顺序执行
用户可以通过;
将多条命令放在一起一同执行。
使用命令
- type —— 说明怎样解释一个命令
- which —— 显示会执行哪个可执行程序
- man —— 显示命令手册页
- apropos —— 显示一系列适合的命令
- info —— 显示命令info
- whatis —— 显示一个命令的简洁描述
- alias —— 创建命令别名
一共可以分成4种命令:
- 可执行程序(file)
- shell的内建命令(builtin)
- shell函数(keyword)
- 命令别名(alias)
利用type command
来显示命令的类型,参数-t可以说明命令类型,-p可以知道可执行文件的路径,-P可以知道可执行文件和别名命令的路径。
利用命令help可以显示shell内建命令的帮助文档。对于内部命令,使用help command;对于外部命令,使用command --help。一般来说,builtin和keyword类型的命令使用help command,如help kill和help if; file和alias类型的命令使用 command --help,如vi --help和grep --help。
利用man命令可以查看所有文件(命令)的相关帮助。man一共有9个章节的内容,如man 7 man
就可以查看第七章中的man命令的相关解释。一般使用man command
man加命令名就可以查看帮助了。另外,如果使用man加命令名找到了用户不想要的东西(也就是发生重名),可以更改章节号进行进一步查看。 第一章是可以从Shell运行的命令(man命令的默认参数);第二章是必须由内核完成的功能(系统调用);第三章是库调用;第四章是dev中的文件;第五章是配置文件的格式;第六章是游戏;第七章是宏;第八章是管理命令;第九章是废弃章节。另外,如果不知道这命令是什么类型或属于哪个章节,可以使用man -a command
进行章节一览,看看哪些章节中有这个命令,按照指示执行即可。
利用info命令可以得到比help更为详细的帮助文档。
利用alias命令可以创建别名。如alias fooo='cd ~ ; ls'
就是把等号后面的命令创建一个新的别名,以后每次使用fooo,就会回到用户家目录并列出所有项。当然,在用户不想使用自定义别名后可以使用unalias命令将之前定义的别名命令进行取消,如unalias fooo
之后就不再能使用fooo命令了。
利用whatis命令可以得到一个简洁的命令介绍。
重定向
- cat —— 连接文件
- sort —— 排序文本行
- uniq —— 报道或省略重复行
- grep —— 打印匹配行
- wc —— 打印文件的行数、单词数和字节个数
- head —— 输出文件第一部分
- tail —— 输出文件的最后一部分
在默认情况下的Terminal中,标准输入是键盘,标准输出和标准错误会直接显示在屏幕上。根据Linux一切皆文件的思想, 实际上的输入输出是在叫做STDIN、STDOUT或STDERR的特殊文件中。所谓的重定向,就是更改输出走向和输入来向,将输入输出和磁盘文件进行挂钩,而不仅仅是使用STDIN、STDOUT或STDERR这些特殊文件。
文件种类 | 英文简称 | 标示符 |
标准输入设备 | STDIN | 0 |
标准输出设备 | STDOUT | 1 |
标准错误输出 | STDERR | 2 |
重定向标准输出
I/O重定向允许我们重新定义标准输出送到哪里。使用">"或">>"进行输出重定向,>表示覆盖输出,>>表示追加输出。ls -l /usr/bin > ls_output.txt
表示将bin中的文件列出,保存在当前工作目录的ls_output.txt文件中。如果只用覆盖输出">"重定向符号,会导致文件被覆盖,只能保留最新的一次重定向指令的结果;如果要保留多次的重定向结果,建议使用">>"符号。
重定向标准错误输出
如果命令输入错误,进行重定向标准输出符">"或">>",就会得到一个空文件。因为像ls之类的指令,错误的位置不会得到任何标准输出。这可以作为清空文件的一个命令,但是如果你想在文件中得到这个错误信息,就必须进行重定向,使用"2>"和"2>>"来进行标准错误重定向。
注:">"和">>"默认为重定向标准输出,如果需要重定向标准错误输出,应使用"2>"和"2>>"。
重定向STDOUT和STDERR到同一文件
上文注释到,STDOUT和STDERR的重定向符是不同的,那如何通过一条命令,可以同时重定向STDOUT和STDERR两种输出,到同一个文件中呢?
可以在原命令最后添加2>&1
在STDOUT重定向(1)的功能上增加STDSTDERR(2)功能。
将不需要的输出重定向到/dev/null
可以将不需要的数据进行重定向,位置是/dev/null
,这个操作相当于没有存储、没有显示任何数据。
连接命令cat
cat命令读取一个或多个文件,然后复制他们到标准输出。换而言之,cat file.txt
可以把文本类型的文档直接输出在命令行中。
利用cat命令和>重定向符也可以对简单文本进行输入。使用cat > file
可以进行文档输入工作。
要记得,使用cat命令输入完毕后,是使用键盘的Ctrl+D键进行结束操作的。
管道线 |
如果在命令行中,有command1 | command2
形式出现,则表示先执行command1再执行command2,且command2的输入是command1的输出,|表示管道线。利用管道线,可以运行多个命令,最终输出一个结果。例如:ls -l / | less
就是将根目录中的详细项利用less文本查看器进行输出。
将若干跟管道线结合在一起使用,形成一个复杂的操作,就被称作过滤器。在过滤器中常见的命令有sort、uniq等。sort命令可以进行排序,uniq命令可以进行去重,wc命令可以查看文本大小。例如,使用ls /usr/bin /bin
会将两个文件分别排序后输出,使用ls /usr/bin /bin | sort | less
会将两个文件合并排序后输出,使用ls /usr/bin /bin | sort | uniq | less
会将两个文件合并排序并去重后输出。wc命令输出的三个数字分别是文档总行数,总单词数,总字节数。
Q&A
Q:Linux中的";"和"|"都可以进行执行,区别是什么?
A:";"是依次执行,不论成功失败,都会执行每一条语句,而"|"是管道,需要符合后一个参数的输入是前一个参数的输出,相当于执行一条复杂的语句。
打印匹配行grep
使用grep pattern file
可以将文本文件中和通配符pattern的匹配行进行打印。例如:ls /usr/bin /bin | sort | uniq | grep zip
可以将名字中含有zip的行进行打印。 grep的常用参数主要有-i
(忽略大小写)和-v
(打印不包含字符)。
打印并保存tee
在Linux中,结果要么被显示出来,要么被打印出来。将tee命令安装在管道上可以在打印的同时保存文件。例如ls /bin | tee file1.txt | grep zip
,这个命令将/bin中的文件名都保存在file1.txt中,并在这些文件名中找出带有zip的进行输出。