Linux 基本操作
1. 实验介绍
1.1 实验内容
本节实验主要和大家一起学习 Linux 的一些设备及环境等概念。为大家介绍了 shell 的基本概念和分类,学习过程中会用到了几个 快捷键的操作,规范的命令行书写,和 Linux 环境下变量的种类和设置,以及 终端概念 等知识。总的来说,学习 Linux 操作之前是应该了解你接下来用到的东西是什么,不然无法从全局的概念上去真正理解和熟练的运用。
1.2 实验知识点
- shell 概述与分类
- 快捷键
- Linux 命令格式
- 环境变量
- 终端介绍
2. shell 概述与分类
2.1 Shell
2.1.1 什么是 shell
Shell 是系统的用户界面,提供了用户和内核进行交互操作的一种接口。同时,Shell 也是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell 有自己的编程语言用于对命令的编辑,它允许用户编写由 shell 命令组成的程序。
通常在图形界面中对实际体验带来差异的不是不同发行版的各种终端模拟器,而是这个 Shell (壳)。有壳就有核,这里的核就是指 UNIX/Linux 内核,Shell 是指"提供给使用者使用界面"的软件 (命令解释器),类似于 DOS 下的 command (命令行)和后来的 cmd.exe。
UNIX/Linux 操作系统下的 Shell 即是用户交互的界面,也是控制系统的脚本语言。当然这一点有别于 Windows 下的命令行,虽然该命令行也提供很简单的控制语句。在 Windows 操作系统下,有些用户从来都不会直接使用 Shell 。然而在 UNIX 系列操作系统下,Shell 仍然是控制系统启动和其它很多实用工具的脚本解释程序。
2.2.2 shell 类别
在 UNIX/Linux 中比较常见的 Shell
- Bourne Again Shell(简称 bash)
- Bourne Shell(简称 sh)
- C-Shell(简称 csh)
- Korn Shell(简称 ksh)
- Z shell(简称 zsh)
Ubuntu 终端默认使用的是 bash,默认的桌面环境 GNOME 或者 Unity(基于GNOME),我们的环境中使用的分别是 zsh 和 xfce。
还可以通过 cat /etc/shells 来查看我们主机上的 shell 类型。
$ cat /etc/shells
在后续课程中会继续学习 shell 的详细使用,这里只做介绍。
2.1.3 第一个 shell 脚本
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh 代表 shell),扩展名并不影响脚本执行。
输入代码:
#! /bin/bash
echo "Hello Shiyanlou !"
先按 ESC 键,再输入 :wq 保存退出编辑,具体的 vim 编辑器 使用会在后面章节详细讲解。
注意:#!是一个约定的标记,告诉系统这个脚本使用指定的解释程序来执行。不指定时,默认使用 $SHELL 变量的值。
3. 快捷键
在学习 linux 课程这条路上,能够掌握几个重要的快捷键,会让你的工作达到事半功倍的效果~
3.1 Tab 键
[Tab]
使用 Tab 键来进行命令补全,Tab 键一般是在字母 Q 旁边,这个技巧给你带来的最大好处就是当你忘记某个命令的全称时可以只输入它的开头的一部分,然后按下 Tab键 就可以自动补全命令或显示匹配键入字符的所有命令。
3.2 常用组合快捷键
表 3-1
快捷键 | 说明 |
---|---|
Ctrl+c | 中断操作 |
Ctrl+d | 键盘输入结束或退出终端 |
Ctrl+s | 暂停当前程序,暂停后按下任意键恢复运行 |
Ctrl+a | 将光标移动到命令行首 |
Ctrl+e | 将光标移动到命令行尾 |
Ctrl+l | 清屏 |
Ctrl+shift+N | 新建终端窗口 |
3.3 利用历史输入命令
很简单,你可以使用键盘上的方向键 ↑ ,恢复你之前输入过的命令。
4. Linux 命令格式
在 Linux 中命令的操作至关重要,也是所有的基础,那么规范的命令格式在学好 Linux 中起到了举足轻重的作用。
4.1 Linux 命令格式
command [options] [arguments]
command:命令
options:定义命令的执行特性,有长短两种选项:
长选项:用 -- 引导,后面跟完整的单词,如 --help
短选项:用 - 引导,后面跟单个的字符,如 -a
argument:参数选项,表示命令的作用对象。
在 linux 中,命令的选项和参数所使用的符号也有相应的含义:
[]:可省略之内容
<>:必须提供
a|b:二选一,或多选一
...:前面的内容可重复出现多次
4.1.1 命令操作小体验
事实上,在 Linux 中的命令操作主要就是 输入 和 输出 两个过程。
- 输入
打开桌面上终端(Xfce),试着创建一个目录,然后回车即可。
# 创建一个叫 dir 的目录文件,mkdir 就是一个命令。
$ mkdir dir
- 输出
# ls 命令是查看当前路径下的文件和目录,所显示的结果就是输出结果
$ ls
# pwd 命令是查看当前路径,pwd 为输出操作,而 /home/shiyanlou 为输出结果
$ pwd
5. 环境变量
和 Windows 系统相似,在安装许多软件的时候是需要去配置环境变量。同样,在 Linux 里也是需要去配置相应的环境变量。而在 Linux 中的环境变量主要是 系统级 和 用户级 ,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量是用户使用系统时加载的环境变量。
- 系统级
- /etc/profile 文件:当用户登录时,操作系统为用户定制的用于登录到系统的每个用户的第一个文件,通常是调用 /etc/bash.bashrc 文件。
- /etc/environment 文件:在登录时操作系统调用的第二个文件,在读取 profile 之前,系统用于设置环境文件的环境变量。
- 用户级(文件主要是在 /home 目录下)
- ~/.profile:每个用户都可以调用来输入自己使用的 shell 信息,不过在用户登录时,该文件只执行一次。
- ~/.bashrc:包含登录用户的专用 bash shell 的 bash 信息。也就是说每开一个 shell ,该文件都会被读取一次。
- 临时的
- 针对当前 shell 的环境变量。
简单来说,环境变量就是指定一个目录,软件在运行的时候,相关程序会按照该目录来查找相关文件。
例如,在默认情况下,一个进程被创建时,除了创建过程会被明确指定,它也将继承其父进程的绝大部分环境设置。如图所示:
5.1 Linux 变量的种类
前面知道可以从系统和用户级来划分环境变量。
若按照变量的生存周期来划分,那么变量就可以分为:
- 永久的:需要修改配置文件,变量永久生效。
- 临时的:使用 export 命令来声明就行,变量在关闭 shell 的时候失效。
若按照环境变量自身的信息来划分,则可以分为:
- 当前 shell 进程私有用户自定义变量。此时变量只在当前 shell 中有效
- shell 自身的内建变量
- 从自定义变量导出的环境变量
5.2 甚至变量的方法
5.2.1 /etc/profile 文件中添加变量(永久的)
用 vim 编辑器编辑 /etc/profile 文件来增加变量,将作用于 Linux 下所有用户,且具有永久性。(此方法谨慎使用!)
5.2.2 修改 ~/.profile 文件(对单一用户生效(永久的))
这种方法较为安全,可以把使用这些环境变量的权限控制到用户级别,主要是针对某一特定的用户,如果需要给某个用户权限使用这些环境变量,只需要修改其个人用户主目录下 .profile 文件就可以了。
eg:编辑 shiyanlou 用户目录(/home/shiyanlou)下的 .profile,即 /home/shiyanlou/.profile 文件。
5.2.3 直接运行 export 命令定义环境变量(临时的)
在控制台中设置,不赞成这种方式,这种设置只对 当前的shell 起作用,换一个 shell 设置就无效了。
在 shell 的命令行下直接使用 [export 变量名=变量值] 来定义变量。
在每个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,已初始化环境,包括添加一些用户自定义环境变量等等。zsh 的配置文件是 .zshrc,相应 Bash 的配置文件为 .bashrc 。它们在 etc 下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件。因此在退出当前 shell 后,临时的自定义环境变量不会在新打开的 shell 中出现。
eg:添加一个自定义变量
$ export shiyanlou="shiyanlou001"
$ echo $shiyanlou
注:使用 echo 输出变量时需要在变量名前面加 $ 符号
5.3 环境变量的查看
5.3.1 export 命令查看
可以用来显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。
可以简单体会一下,现在 Shell 中设置一个变量 temp=shiyanlou,然后在新创建一个 Shell 查看 temp 变量的值:
$ cd ~
$ temp=shiyanlou
$ echo $temp
$ zsh # 创建子进程,实验楼环境使用的是 zsh,ubuntu 默认的 shell 为 bash
$ echo $temp
$ exit
$ export temp
$ zsh
$ echo $temp
5.3.2 echo 命令
例如,我们查看 PATH 环境变量
$ echo $PATH
/opt/swift/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/shiyanlou/anaconda3/bin
5.3.3 env 命令查看所有的环境变量
可以用来显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。
$ env
LC_MESSAGES=zh_CN.UTF-8
XDG_CONFIG_DIRS=/etc/xdg
LC_TELEPHONE=zh_CN.UTF-8
VNCDESKTOP=d7f586d07116:1 (shiyanlou)
LANG=zh_CN.UTF-8
SHLVL=5
PWD=/home/shiyanlou
LOGNAME=shiyanlou
LC_CTYPE=zh_CN.UTF-8
git_user=767887284
LC_NAME=zh_CN.UTF-8
LANGUAGE=zh_CN:zh
......
5.3.4 set 命令查看本地定义的环境变量
可以用来显示 当前 Shell 所有变量,包括期内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。
$ set
5.3.5 使用 vimdiff 直观查看环境变量
对于刚才讲到的三种环境变量的查看:export、env、set 我们还可以通过 vimdiff 工具来直观的比较它们之间的差别:
$ temp=shiyanlou
$ export temp_env=shiyanlou
$ env|sort>sort.txt
$ export|sort>export.txt
$ set|sort>set.txt
命令的输出使用到了管道 | 和用 sort 命令来排序,将文本文件重定向。
$ vimdiff env.txt export.txt set.txt
5.3.6 修改和删除环境变量
修改环境变量
变量的修改有以下几种方式:
变量设置的方式 | 说明 |
---|---|
${变量名#匹配字符} | 从头向后开始匹配,删除符合匹配字符的最短数据 |
${变量名##匹配字符} | 从头向后开始匹配,删除符合匹配字符的最长数据 |
${变量名%匹配字符} | 从尾向前开始匹配,删除符合匹配字符的最短数据 |
${变量名%%匹配字符} | 从尾向前开始匹配,删除符合匹配字符的最长数据 |
${变量名/旧的字符/新的字符} | 将符合旧字符的第一个字符替换为新的字符 |
${变量名//旧的字符/新的字符} | 将符合旧字符的全部字符替换为新的字符 |
比如修改添加到 PATH 的环境变量。为了避免操作失误导致命令找不到,我们先将 PATH 赋值给一个新的自定义变量 newpath:
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc # 自定义路径直接添加内容到 .zshrc 中
$ path=$PATH
$ echo $path
$ path=${path%/home/shiyanlou/mybin}
# 或使用通配符,*表示任意多个任意字符
$ path=${path%*/mybin}
删除环境变量
unset 可以用来删除指定的环境变量
$ unset temp
5.4 环境变量的生效
source 命令可以读取并执行指定文件中的命令,这里我们可以通过该命令来让配置的文件立即生效,避免了每次修改配置脚本文件后,还需要退出终端甚至重启之后才能生效的问题。
$ source .zshrc
eg:.zshrc 是 home 目录下的 zsh 配置文件(实验环境中的 shell 是 zsh,ubuntu 默认的 shell 是 bash)
5.4 常用的环境变量
环境变量 | 说明 |
---|---|
PATH | 决定了 shell 将到哪些目录中寻找命令或程序 |
HOME | 当前用户主目录 |
HISTSIZE | 历史记录数 |
LOGNAME | 当前用户的登录名 |
HOSTNAME | 指主机的名称 |
SHELL | 当前用户 Shell 类型 |
LANGUGE | 语言相关的环境变量,多语言可以修改此环境变量 |
当前用户的邮件存放目录 | |
PS1 | 基本提示符,对于 root 用户是 #,对于普通用户是 $ |
6. 终端—人与机器交互的接口
人和机器是两个相互独立的实体。当人使用机器时,必须借助某种接口(interface)才能与机器交流信息。台式机的接口包括显示器、键盘、鼠标、扬声器、麦克风等。
CPU、内存、硬盘、光驱、显卡、网卡等其他硬件属于主机(host)。而 Unix 和 Linux 把这种使得人和机器可以交互的接口称为 终端。
终端具有两个基本功能:向主机输入信息和向外部输出信息。所以终端可以分为输入设备和输出设备。
Linux 的终端类型:
- /dev/tty,当前进程的控制终端
- /dev/ttySn,串行口终端
- /dev/pty,伪终端
- /dev/ttyn,tty1~tty6 是虚拟终端,tty0 当前虚拟终端的别名
- /dev/console,控制台终端
Linux 常见终端模拟器
- gnome-terminal
- Konsole
- xterm
- rxvt
- kvt
- nxterm
- eterm
目前实验环境中的终端程序时 xfce 桌面环境自带的 xfce-terminal。
6.1 tty/pty/pts
tty
tty 是终端设备的统称,原指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的媒介,后来因为被键盘和现实器取代,所以现在称为终端。
终端是一种字符型设备,有多种类型,通常使用 tty 来简称各种类型的终端设备。
pty(虚拟终端)
当我们需要远程 telnet 到主机或使用 xterm 时就希望有一个终端来完成交互,因此就有了虚拟终端 pty(pseudo-tty)。
pts
pts(pseudo-terminal slave)是 pty 的实现方法,和 ptmx(pseudo-terminal master)配合使用实现 pty。
在 Linux 系统的设备特殊文件目录 /dev/ 下,终端特殊设备文件一般有以下几种:
- 串行端口终端(/dev/ttySn)
串行端口终端(Serial Port Terminal)是使用电脑串行端口连接的终端设备。电脑把每个串行端口都看作是个字符设备。
这些串行端口所对应的设备名称是 /dev/tts/0(或/dev/ttyS0),/dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0),(4,1)等,分别对应于 DOS 系统下的 COM1,COM2 等。若要向一个端口发送数据,能够在命令行上把标准输出重定向到这些特别文档名上即可。
- 伪终端(/dev/pty)
伪终端(Pseudo Terminal)是成对的逻辑终端设备(即 master 和 slave 设备,对 master 的操作会反映到 slave 上)。
- 控制终端(/dev/tty)
如果当前进程有控制终端(Controlling Terminal)的话,那么 /dev/tty 就是当前进程的控制终端的设备特殊文件。可以使用命令 "ps -ax" 来查看进程与哪个控制终端相连。对于登录的 shell,/dev/tty 就是你使用的终端,设备号是(5,0)。使用命令 "tty" 可以查看它具体对应哪个实际终端设备。
6.2 console
说到 console 常常容易和 terminal 有所混淆。传统上讲,terminal(终端)其实是处于用户使用系统的角度来说的,相对于提供服务的系统终端是用户使用这个系统的入口。而 console(控制台)更强调是控制系统的地方,其使用者主要是管理员。
Console 是用来管理主机的,而且一个主机只有一个 console。Console 与一般终端在外表上没什么区别,但在功能上却大不相同,有些事情只能在 console 完成,而不能在终端完成。
6.3 控制台终端文件(/dev/cosnole)
在 Linux 系统中,仿真了类型为 Linux 的一种终端(TERM = Linux),并且有一些设备特殊文件与之相关联:tty0,tty1,tty2 等。当你在控制台上登录时,使用的是 tty1。使用 Alt+[F1-F6] 组合键时,就可以切换到 tty2、tty3 等上面去。tty1-tty6 等成为虚拟终端,而 tty0 则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。不过只有系统或超级用户 root 可以向 /dev/tty0 进行写操作。
虽然可以在物理机系统上通过使用 [Ctrl]+[Alt]+[F1]~[F6] 进行切换,但是在我们的在线实验环境种可能无法切换,因为特殊功能按键会被你的主机系统劫持。当你切换到其中一个终端后想要切换回图形界面,可以按下 [Ctrl]+[Alt]+[F7] 来完成。
7 总结
通过本节的学习希望大家能够对 shell 的基本概念和类别、快捷键的操作、规范的命令格式书写、还有环境变量和设置 有足够的认识和理解,最后就是能够知道 tty\pty\pts\console 等设备终端。